Zgodnie z dokumentacją psycopg2 (http://initd.org/psycopg/docs/connection.html) w Stanach:
Warning Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.
W ostrzeżeniu odnosi się konkretnie do nie robienia czegoś takiego:
cur.execute(SQL % data)
Czy to ostrzeżenie dotyczy również następujących przy użyciu formatu?
cur.execute(SQL.format(data))
Nie znam elementów wewnętrznych formatu, ale zakładam, że używa on% string interop pod spodem, co spowodowałoby, że jego użycie byłoby niewskazane
Odpowiedzi:
0 dla odpowiedzi № 1SQL.format()
(gdzie SQL
jest zwykłym „ciągiem Pythona”, którego tak naprawdę nie używa %
interpolacja pod maską, ale ma tę samą pułapkę: wartości, które zastępujesz, nie są poprawnie zastępowane przez SQL (jak to możliwe; Python nie ma pojęcia, że SQL
jest instrukcją SQL), a twoja instrukcja SQL może zostać następnie poddana atakom iniekcyjnym.
Różne moduły SQL mają metody zapobiegające temu problemowi i należy ich użyć.
0 dla odpowiedzi nr 2
Tak. Metody interpolacji ciągów są delikatne, ponieważ umożliwiają atak typu SQL injection. Wykorzystanie zewnętrznych (podanych przez użytkownika) danych jako parametrów w sparametryzowanych zapytaniach (zamiast budowania ciągu zapytania) uniemożliwia tego rodzaju atak.