SQL-инъекция с использованием Python

#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__() .