Uważaj na interpolację ciągów znaków dla zapytań SQL, ponieważ nie spowoduje to poprawnej ucieczki parametrów wejściowych i pozostawi Twoją aplikację otwartą na luki związane z iniekcją SQL. Różnica może wydawać się banalna, ale w rzeczywistości jest ogromna .
Nieprawidłowo (z problemami z bezpieczeństwem)
c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))
Poprawnie (z ucieczką)
c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))
Zwiększa zamieszanie, że modyfikatory używane do wiązania parametrów w instrukcji SQL różnią się w zależności od implementacji API DB oraz że biblioteka klienta mysql używa printf
składnia stylu zamiast powszechnie akceptowanego „?” znacznik (używany np. przez python-sqlite
).