cómo generar de forma segura una instrucción SQL como el uso de Python DB-API
-
21-09-2019 - |
Pregunta
Estoy intentando montar el siguiente declaración SQL mediante DB-API de Python:
SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';
donde BEGINNING_OF_STRING debe ser una var pitón para ser llenado de manera segura a través de la DB-API. Probé
beginningOfString = 'abc'
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString)
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)
Estoy fuera de las ideas; ¿cuál es la forma correcta de hacer esto?
Solución
Lo mejor es separar los parámetros de la sql si es posible. A continuación, puede dejar que el PP módulo de cuidar de citar adecuada de los parámetros.
sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
Otros consejos
EDIT:
Como Brian y Thomas señalaron, la ahora una mejor manera de hacer esto sería utilizar:
beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )
ya que las primeras hojas de método se abre a ataques de inyección SQL.
izquierda en la historia:
Trate:
cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
Sqlite3 documentación:
Por lo general, sus operaciones SQL necesitará utilizar valores de variables de Python. No se debe montar su consulta mediante operaciones de cadenas de Python porque hacerlo es inseguro; hace su programa vulnerable a un SQL ataque de inyección.
En su lugar, utilice el parámetro de DB-API sustitución. Poner ? como un marcador de posición donde quiera que desee utilizar un valor, y a continuación, proporcionar una tupla de valores como la segundo argumento de la década de cursor ejecutar método (). (Otras bases de datos módulos pueden usar una diferente marcador de posición, tales como% s o:. 1) Para ejemplo:
# Never do this -- insecure! symbol = 'IBM' c.execute("... where symbol = '%s'" % symbol) # Do this instead t = (symbol,) c.execute('select * from stocks where symbol=?', t) # Larger example for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ]: c.execute('insert into stocks values (?,?,?,?,?)', t)
Creo que quieres esto:
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )