Uważam, że takie parametryczne stwierdzenia mają być używane z wartościami a nie nazwy tabel (lub słowa kluczowe SQL itp.). Więc w zasadzie nie masz z tym szczęścia.
Jednak nie martw się, ponieważ ten mechanizm ma zapobiegać wstrzykiwaniu SQL, a zwykle wiesz, do której tabeli chcesz uzyskać dostęp w czasie pisania kodu, więc istnieje niewielka szansa, że ktoś może wstrzyknąć złośliwy kod. Po prostu idź dalej i wpisz tabelę w łańcuchu.
Jeśli z jakiegoś (być może przewrotnego) powodu zachowujesz parametryczną nazwę tabeli w ten sposób:
- Jeżeli nazwa tabeli pochodzi z twojego programu (np. ze słownika lub atrybutu klasy), wykonaj zwykłe podstawienie ciągu.
- Jeśli nazwa tabeli pochodzi ze świata zewnętrznego (pomyśl „dane wejściowe użytkownika”):albo nie rób tego, albo całkowicie zaufaj użytkownikowi i zastosuj poprzednie podejście 1.
Na przykład:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Niech trzeci %s zostanie zastąpiony innym '%s' w tym momencie, aby umożliwić późniejsze przetwarzanie przez psycopg2#2
:To jest ciąg, który będzie poprawnie cytowany przez psycopg2 i umieszczony zamiast trzeciego '%s' w oryginalnym ciągu