2009-08-13 21 views
12

Estoy desarrollando una aplicación en AIR a través de Flex, pero no veo por dónde me estoy equivocando con SQLite (estoy acostumbrado a MySQL). Los parámetros funcionan, pero solo en ciertas instancias. ¿Es esto parte del sistema de saneamiento incorporado contra la inyección de sql? ¡Gracias por cualquier ayuda!Parámetros de SQLite - No se permite el nombre de tabla como parámetro

Obras:

sqlite

"INSERT: Los campos de la categoría", donde el parámetro es: Fields = "*"

as3

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

Do esn't trabajo (error de sintaxis SQL en ": Tabla"):

sqlite

"INSERT: campos de: Tabla", donde los parámetros son: Fields = "*" y: Tabla = "Categoría"

AS3

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

Respuesta

30

Generalmente no se pueden usar parámetros SQL/marcadores de posición para identificadores de base de datos (tablas, columnas, vistas, esquemas) , etc.) o las funciones de la base de datos (p. ej., CURRENT_DATE), pero en su lugar solo para los valores literales .

Con soporte del lado del servidor para declaraciones parametrizadas (también preparadas), el motor de DB analiza su consulta una vez, recordando los peculiares de cualquier parámetro - sus tipos, longitudes máximas, precisiones, etc. - que enlazará en las ejecuciones posteriores de la consulta ya analizada. Pero la consulta no se puede analizar correctamente en sus elementos sintácticos si se desconocen los bits críticos, como los objetos de la base de datos.

Por lo tanto, uno generalmente tiene que sustituir los nombres de tabla uno mismo, en un procedimiento almacenado o en un código de cliente que concatena/interpola/hace que la sentencia SQL se ejecute correctamente. En cualquier caso, recuerde usar la función de la API de SQL para citando los identificadores de la base de datos, ya que la API no lo hará por usted.

+1

Su primer párrafo lo dice todo. – Lucky

-1

No estoy seguro si esto es lo mismo, pero me encontré con algo similar en Java. Básicamente no se puede agregar una tabla como parámetro lo que debe generar la declaración de este modo:

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

Se trata en su mayoría probablemente no es la solución más segura, por lo que es posible que desee algo de validación personalizada de los datos antes de agregar el nombre de la tabla ... por lo que alguien no intenta enviar el nombre de la tabla "; drop tableName ..."

Cuestiones relacionadas