come generare in modo sicuro un'istruzione SQL come l'utilizzo di python db-api
-
21-09-2019 - |
Domanda
Sto cercando di assemblare la seguente istruzione SQL tramite db-API di Python:
SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';
dove BEGINNING_OF_STRING dovrebbe essere un pitone var da riempire in modo sicuro attraverso il DB-API. Ho cercato
beginningOfString = 'abc'
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString)
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)
Sono a corto di idee; qual è il modo corretto di fare questo?
Soluzione
E 'meglio per separare i parametri da SQL se potete. Poi si può lasciare che il db modulo di prendersi cura di una corretta citazione dei parametri.
sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
Altri suggerimenti
Modifica
Come hanno notato anche Brian e Thomas, il molto il modo migliore per farlo sarebbe quello di utilizzare:
beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )
dal momento che il primo metodo lascia si apre ad attacchi di SQL injection.
A sinistra in per la storia:
Prova:
cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
Prendere nota di Sqlite3 documentazione:
Di solito le operazioni di SQL avranno bisogno di utilizzare i valori dalle variabili Python. Non si dovrebbe assemblare la query usando operazioni sulle stringhe di Python perché così facendo è insicuro; esso rende il programma vulnerabile ad uno SQL attacco iniezione.
Al contrario, utilizzare il parametro della DB-API sostituzione. Mettere ? come segnaposto ovunque si desidera utilizzare un valore, e quindi fornire una tupla di valori come secondo argomento al cursore di eseguire il metodo (). (Altro database I moduli possono utilizzare un diverso segnaposto, ad esempio% s o. 1) Per Esempio:
# 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)
Penso che si desidera in questo modo:
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )