У меня есть следующий код, который полностью безопасен, и пользователь не может вводить что-либо, что может привести к внедрению SQL.
value = get_value_from_user_input()
query = \
"""
SELECT *
FROM TestTable
WHERE CompareValue = ?
"""
cursor.execute(query, value)
Но что, если мне понадобится получить имя таблицы от пользователя.Я не могу сделать это так, потому что это делает меня уязвимым для SQL-инъекций;
table_name = get_table_name_from_user_input()
query = \
f"""
SELECT *
FROM {table_name}
WHERE CompareValue = 1234
"""
cursor.execute(query)
И я также не могу сделать это так (что было бы логичным imo), потому что это выдает ошибку.
table_name = get_table_name_from_user_input()
query = \
"""
SELECT *
FROM ?
WHERE CompareValue = 1234
"""
cursor.execute(query, table_name)
Так как мне это сделать?
Дополнительная информация:
Программа предназначена для использования внутри моей компании и всех пользователейПрограммное обеспечение имеет права администратора на базу данных.Возможно, было бы бессмысленно запретить им вводить SQL, так как они в любом случае могут выполнять необработанные запросы SQL.Я просто хочу быть педантичным и не позволять моей программе выполнять произвольный SQL.get_table_name_from_user_input()
фактически получает имя таблицы из файла конфигурации, который описывает структуру базы данных, поэтому пользователь может легко отредактировать ее, если когда-нибудь имена таблиц изменятся в базе данных, без необходимости трогать исходный код.