2012-06-08 44 views
6

Tengo un código en Python que establece un valor char (80) en una base de datos sqlite.Protección contra inyección SQL en python

La cadena se obtiene directamente del usuario a través de un campo de entrada de texto y se envía de vuelta al servidor con un método POST en una estructura JSON.

En el lado del servidor actualmente transfiero la cadena a un método que llama a la operación SQL ACTUALIZAR.

Funciona, pero soy consciente de que no es seguro en absoluto.

Espero que el lado del cliente no sea seguro de todos modos, por lo que cualquier protección se pondrá en el lado del servidor. ¿Qué puedo hacer para asegurar la operación UPDATE contra la inyección de SQL?

Una función que "citaría" el texto para que no pueda confundir el analizador SQL es lo que estoy buscando. Espero que tal función exista pero no pude encontrarla.

Editar: Aquí está fijando mi código actual de la etiqueta del nombre de campo Char:

def setLabel(self, userId, refId, label): 
    self._db.cursor().execute(""" 
     UPDATE items SET label = ? WHERE userId IS ? AND refId IS ?""", (label, userId, refId)) 
    self._db.commit() 
+0

no soporta pitón consultas con parámetros? –

+0

@Jeremy. Sí ... pero realmente se trata de si la biblioteca de Python para cualquier base de datos en particular lo admite (lo que AFAIK hacen todos). – Gerrat

+0

Sí. Así que considere mi pregunta, ya que preguntar lo que hago es suficiente para garantizar la protección contra la inyección de sql. – chmike

Respuesta

7

De la documentación:

con.execute("insert into person(firstname) values (?)", ("Joe",)) 

Esta escapa "Joe", así que lo que quiere es

con.execute("insert into person(firstname) values (?)", (firstname_from_client,)) 
+0

Actualicé mi pregunta con el código que uso actualmente. Lo hice como tu sugieres. ¿Significa que mi código es seguro contra la inyección de SQL? – chmike

+0

Olvidé que "escapar" significa proteger contra la inyección sql. Te di la respuesta por el ejemplo. Muchas gracias por compartir tu conocimiento y ayudarme. – chmike

0

Noooo ... VARIABLES DE USO BIND! Para eso están allí. Ver this

Otro nombre para la técnica es parameterized sql (creo que "bind variables" puede ser el nombre usado con Oracle específicamente).

+0

¿Qué son variables BIND? Cualquier URL para sugerir? Agrega una respuesta. – chmike

+0

Seguro ... ¿qué RDBMS estás usando? – Gerrat

+0

Estoy usando sqlite por ahora. Todavía no es la versión de producción de mi aplicación web. – chmike

1

La DB-API .execute() admite la sustitución de parámetros, que se ocupará de escapar para usted, se menciona cerca de la parte superior de los documentos; http://docs.python.org/library/sqlite3.html anterior Nunca haga esto - inseguro.

+0

Gracias por la referencia. Recuerdo haber leído esto hace mucho tiempo y haberlo hecho desde entonces. No sabía que me estaba protegiendo contra la inyección de SQL. Eso es genial. Lo hice de la manera correcta. Perdón por no darte la respuesta. Martijn tiene menos puntos que usted y dio un ejemplo que sería útil para personas como yo que buscan una respuesta a esta pregunta. – chmike

Cuestiones relacionadas