#python #mysql #sql-injection
#python #mysql #sql-инъекция
Вопрос:
У меня следующая проблема: мне нужен динамический оператор create, в зависимости от того, какие атрибуты имеет мой объект.
его следующий объект:
class Table:
columns = []
def __init__(self, name, columns):
self.columns = columns
self.name = name
def columnsNumber(self) -> int:
return self.columns.__len__()
вот как выглядит вставка:
sql = "INSERT INTO tableOverview (tableName, columns, datum) VALUES(%s, %s, CURRENT_TIMESTAMP);"
val = (table.name, table.columns.__len__())
await cursor.execute(sql, (val))
for x in table.columns:
sql = "ALTER TABLE %s ADD COLUMN %s VARCHAR(100) UNIQUE " % (table.name,x)
await cursor.execute(sql)
теперь я не знаю, как предотвратить SQL-инъекцию.
Ответ №1:
Для ALTER TABLE
операторов вы можете заключать имена идентификаторов в кавычки с обратными метками, как описано здесь .
for x in table.columns:
sql = "ALTER TABLE `%s` ADD COLUMN `%s` VARCHAR(100) UNIQUE " % (table.name,x)
await cursor.execute(sql)
В инструкции insert код уже корректно использует подстановку параметров, чтобы убедиться, что вставленные значения правильно заключены в кавычки.
sql = "INSERT INTO tableOverview (tableName, columns, datum) VALUES(%s, %s, CURRENT_TIMESTAMP);"
val = (table.name, table.columns.len())
await cursor.execute(sql, val)
Комментарии:
1. Точка стиля: мы обычно не вызываем
__len__()
напрямую в python или не создаем методы с именемlen
: если классу необходимо предоставить способ определения его длины__len__()
, но вызвать его черезlen(obj)
, нетobj.__len__()
.