2011-03-31 20 views
5

Estoy intentando crear una tabla en una base de datos SQLite basada en el texto proporcionado por el usuario. Todo funcionaba correctamente, excepto cuando intenté agregar un apóstrofo dentro del texto (que sería el nuevo nombre de la tabla). Después de la investigación, decidí que lo que estaba haciendo no es la mejor práctica como es vulnerable a la inyección:Inserción segura de datos en la base de datos SQLite con el apóstrofo

const char *sqlStr = [[NSString stringWithFormat:@"CREATE Table '%@' ('Name' 'char(50)','ID' 'integer')",theString]UTF8String]; 

Así que estoy tratando de encontrar una manera de permitir que los apóstrofes que se incluirán en el nombre de tabla e insertar de forma segura el valor en la base de datos. He leído acerca de los valores de enlace, pero ¿es esto posible con la declaración 'CREATE TABLE'? ¿O solo cuando insertas datos en una tabla ya existente?

Gracias por su ayuda.

+0

no recomendaría que permite al usuario o alguna otra forma dinámica de nombrar columnas. En todo caso, nombre la columna custom1. – Joe

+0

Hola Joe, quiero que el usuario cree el nombre de la tabla en la base de datos, no las columnas, que no serán modificables. Simplemente no sé la mejor manera de hacerlo cuando trabaje con apóstrofes. – Ryan

+1

Si usa [FMDB] (http://github.com/ccgus/FMDB), manejará todos los elementos de escape necesarios antes de ejecutar su SQL (siempre que use su API para sustitución). Yo * altamente * recomiendo que lo revises. –

Respuesta

10

Desde el documentation:

Una constante de cadena está formada por encerrar la cadena entre comillas simples ('). Una comilla simple dentro de la cadena se puede codificar colocando dos comillas simples en una fila, como en Pascal.

Por lo tanto:

[theString stringByReplacingOccurrencesOfString:@"'" withString:@"''"]; 
+0

Lo he usado para insertar valores, pero cuando traté de recuperarlo de DB me da una fila en blanco. como '" Seleccionar * De TABLA DONDE Nombre = 'tom' s '"' –

Cuestiones relacionadas