wie man sicher eine SQL-LIKE-Anweisung mit Python db-api erzeugen
-
21-09-2019 - |
Frage
Ich versuche, die folgende SQL-Anweisung Pythons db-api zu montieren:
SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';
wo BEGINNING_OF_STRING sollte eine Python var sicher in dem durch das DB-API gefüllt werden. Ich habe versucht,
beginningOfString = 'abc'
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString)
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)
Ich bin aus Ideen; Was ist der richtige Weg, um dies?
zu tunLösung
Am besten ist es, die Parameter aus der SQL zu trennen, wenn Sie können. Dann können Sie das DB-Modul kümmern sich um die richtige lassen der Parameter zitieren.
sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
Andere Tipps
EDIT:
Als Brian und Thomas erwähnten, ist der weit bessere Weg, dies zu tun wäre, zu verwenden:
beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )
, da die erste Methode Blätter öffnen Sie SQL-Injection-Angriffe.
links in für Geschichte:
Versuchen Sie:
cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
Beachten Sie Sqlite3 Dokumentation:
wird normalerweise Ihre SQL-Operationen benötigen Werte von Python-Variablen zu verwenden. Sie sollten Ihre Abfrage nicht zusammenbauen Verwendung von Python-String-Operationen weil so tun, ist unsicher; es macht Ihr Programm anfällig für einen SQL Injection-Angriff.
Verwenden Sie stattdessen die DB-API-Parameter Auswechslung. Stellen ? als Platzhalter wo wollen Sie einen Wert verwenden, und liefert dann ein Tupel von Werten als die zweites Argument der Cursor execute () Methode. (Andere Datenbank Module können eine andere verwenden Platzhalter, wie% s oder:. 1) Beispiel:
# 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)
Ich glaube, Sie wollen diese:
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )