2009-08-13 5 views
12

Je développe une application dans AIR via Flex, mais je ne vois pas où je vais mal avec SQLite (je suis habitué à MySQL). Les paramètres fonctionnent, mais seulement dans certains cas. Est-ce que cela fait partie du système d'assainissement intégré contre l'injection de sql? Merci pour toute aide!Paramètres SQLite - Ne pas autoriser le nom de table comme paramètre

Travaux:

sqlite

"INSERT: Les champs de la catégorie", où le paramètre est: fields = "*"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM Category"; 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

Faire esn't travail (erreur de syntaxe SQL à ": Table"):

sqlite

"INSERT: champs de: Tableau", où les paramètres sont les suivants: Les champs = "*" et: Table = "Catégorie"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM :Table"; 
statement.parameters[":Fields"] = "*"; 
statement.parameters[":Table"] = "Category"; 
statement.execute; 

Répondre

30

Généralement on ne peut pas utiliser les paramètres SQL/placeholders pour identifiants de base de données (tables, colonnes, vues, schémas , etc.) ou des fonctions de base de données (par exemple, CURRENT_DATE), mais à la place uniquement pour lier les valeurs littérales . Avec le support côté serveur pour les instructions paramétrées, le moteur DB analyse votre requête une seule fois, en se souvenant des caractéristiques de tous les paramètres (leurs types, longueurs max, précisions, etc.) que vous lierez dans les exécutions ultérieures de la requête déjà analysée. Mais la requête ne peut pas être correctement analysée dans ses éléments syntaxiques si les bits critiques, comme les objets de base de données, sont inconnus. Donc, il faut généralement substituer soi-même les noms des tables, dans une procédure stockée ou dans un code client qui concatège/interpole/vérifie dynamiquement l'instruction SQL pour qu'elle soit correctement exécutée. Dans tous les cas, n'oubliez pas d'utiliser la fonction de votre API SQL pour en indiquant les identifiants de base de données, car l'API ne le fera pas pour vous.

+1

Votre premier paragraphe dit tout. – Lucky

-1

Je ne sais pas si cela est la même chose, mais je suis tombé sur quelque chose de similaire à Java. Fondamentalement, vous ne pouvez pas ajouter une table en tant que paramètre de sorte que vous devez générer la déclaration comme ceci:

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category"); 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

Ceci est la plupart du temps sans doute pas la solution securest, vous voudrez peut-être une certaine validation personnalisée des données avant d'ajouter le nom de la table .. donc quelqu'un n'essaie pas de lui envoyer le nom de la table "; drop tableName ..."

Questions connexes