Поскольку ваш вопрос касается внедрения SQL, я пойду немного дальше, чем дать вам один вкладыш.Ваша проблема в том, что вы не можете параметризовать имя таблицы.При работе с SQL-инъекцией вы должны различать динамический SQL-запрос и вводимые пользователем значения.Экранирование значений для защиты от внедрения SQL должно обрабатываться механизмом кавычек / экранирования драйвера.Вы самостоятельно проверяете фрагменты динамического SQL.К фрагментам динамического SQL относятся такие вещи, как выражения условий переменной WHERE, имена таблиц переменных или списки полей переменных SELECT.
Правильный синтаксис для вашего примера:
cursor.execute("UPDATE {} SET {} = %s".format(table, field), value)
или
cursor.execute("UPDATE %s SET %s = %%s" % (table, field), value)
Однако, если таблица получена от пользователя, вы должны проверить ее по некоторому предопределенному списку, прежде чем перейти к этому утверждению.Вы не можете доверять базе данных, чтобы делать правильные вещи с именами таблиц или полей.Следующая структура данных предоставит что-то для проверки, например:
valid_fields = {
'table_1': ['field_1', 'field_2'],
'table_2': ['field_a', 'field_b'],
'table_3': ['field_x', 'field_y']
}
Вы также можете использовать специальные таблицы каталога, которые предоставляет ваша база данных (например, pg_catalog), чтобы получить их динамически, но вы все равно должны проверить наличие специального поля/ имена таблиц (например, OID).