2010-02-08 8 views
7

Es imposible sqlite3_bind_text un nombre de tabla porque sqlite3_prepare_v2 falla para preparar una declaración como:¿Hay alguna API C SQLite para citar/escapar del nombre de una tabla?

SELECT * FROM ? ; 

supongo que se necesita el nombre de la tabla a analizar la instrucción, por lo que las necesidades de cotización de haber ocurrido antes sqlite3_prepare_v2.

¿Hay algo así como un sqlite3_quote_tablename? Tal vez ya exista bajo un nombre que no puedo reconocer, pero no puedo encontrar nada en la lista de funciones.

+1

su función propuesta sqlite3_quote_tablename podría desinfectar la entrada para evitar ataques de inyección sql. Para hacer esto, podría analizar la entrada para asegurarse de que sea una cadena literal. http://www.sqlite.org/lang_expr.html#litvalue – momeara

+0

Una respuesta muy tardía: gracias, esa fue la ruta que tomé. Mi antiguo empleador posee ese código ahora, sin embargo. Si desea publicar esto como respuesta, lo aceptaré :) – gavinbeatty

Respuesta

1

su función sqlite3_quote_tablename propuesta podría desinfectar la entrada para evitar ataques de inyección SQL. Para hacer esto, podría analizar la entrada para asegurarse de que sea una cadena literal. http://sqlite.org/lang_expr.html#litvalue

+0

T La respuesta es que mi función propuesta no existe, y el enlace es una guía útil para implementarla; – gavinbeatty

2

Si el nombre de una tabla tiene caracteres no válidos, puede encerrar el nombre de la tabla entre comillas dobles, como esta.

sqlite> create table "test table" (id); 
sqlite> insert into "test table" values (1); 
sqlite> select * from "test table"; 
id 
---------- 
1 

Por supuesto, debe evitar el uso de caracteres no válidos siempre que sea posible. Esto complica el desarrollo y casi siempre es innecesario (OMI, la única vez que es necesario es cuando heredas un proyecto que ya está hecho de esta manera y es demasiado grande para cambiarlo).

+0

El problema es hacer esto programáticamente. ¿Hay un método oficial? – gavinbeatty

+0

+1 por ser la primera fuente que pude encontrar que me dijo el carácter de escape para tablas y columnas. Aparentemente mi google-fu es débil hoy ... –

+0

@Charlie Kilian, gracias, sql es bastante consistente de una base de datos a otra, lo difícil es encontrar todas las pequeñas inconsistencias. Algunas otras bases de datos, como el servidor sql y el acceso, usan '[' y ']' para el escape de nombres de objetos no válidos. sqlite utiliza '" ', que curiosamente también se puede usar para cadenas, aunque' '' es más estándar y está soportado en sqlite y en la mayoría de las bases de datos. –

0

Si SQLite no acepta nombres de tabla como parámetros, no creo que hay una solución para su problema ...

Tener en cuenta que:

parámetros que no están asignados los valores que usan sqlite3_bind() se tratan como NULL.

así que en el caso de su consulta, el nombre de la tabla sería NULL, que por supuesto no es válido.

+0

No hay ninguna instrucción en 'sqlite3_step' cuando' sqlite3_prepare_v2' falla. I ' Estoy preguntando si hay otra API disponible para hacer algo así como vincular un nombre de tabla. Algo así como 'printf"% q "' en bash. editar: formatear – gavinbeatty

+1

Lo que quiero decir es que no se puede preparar una declaración que pueda generar a un enlace incorrecto de los parámetros. –

1

Al utilizar SQLite preparado estados con los parámetros del parámetro: "especifica un marcador de posición en la expresión de un valor literal que se llena en al tiempo de ejecución"

Antes de ejecutar cualquier sentencia SQL, SQLite "compila" la cadena SQL en una serie de opcodes que son ejecutados por una máquina virtual interna. Los nombres de tabla y columna sobre los que opera la instrucción SQL son necesarios como parte del proceso de compilación.

Usted puede parámetros de uso para unir los "valores" a declaraciones preparadas de esta manera:

SELECT * FROM FOO WHERE name=?; 

y luego llamar sqlite3_bind_text() para unir la cadena gavinbeatty a la declaración ya compilado. Sin embargo, esta arquitectura significa que usted no puede parámetros de uso de este tipo:

SELECT * FROM ? WHERE name=?; // Can't bind table name as a parameter 
SELECT * FROM FOO WHERE ?=10; // Can't bind column name as a parameter 
+1

Sé que el nombre de la tabla no puede vincularse porque la etapa de análisis/compilación requiere el nombre de la tabla. Estoy buscando una forma establecida de probar que un nombre de tabla es válido o canonicalizar un nombre de la tabla. – gavinbeatty

0

Estaba buscando algo como esto y tampoco pude encontrarlo. En mi caso, los nombres de tabla esperados siempre se encontraban entre un conjunto fijo de tablas (por lo que eran fáciles de validar).Por otro lado, los nombres de los campos no eran así, terminé filtrando la cadena, eliminando casi todo lo que no era una letra, un número o un guión bajo (sabía que mis campos se ajustaría a estos parámetros). Eso hizo el truco.

Cuestiones relacionadas