Python MySQL, это подготовленное заявление? - PullRequest
0 голосов
/ 25 августа 2018

Я настраиваю приложение mysql.Это мой метод getUsername подключается с использованием стандартного форматирования mysqldb.Значит ли это, что это готовое заявление?Кроме того, этот код безопасен, или я уязвим для SQL-инъекций?

def selectUser(userName):
    try:
        username = pickle.loads(base64.decode(userName))
    except:
        username = "admin"
    query = "SELECT name FROM users WHERE name = '%s'"
    conn = MySQLdb.connect('localhost', 'dbAdmin', 'lja8j30lJJal##', 'blog');
    with conn:
        c = conn.cursor()
        c.execute(query, (username,))

1 Ответ

0 голосов
/ 25 августа 2018

Нет - в MySQLdb нет никакого способа сделать подготовленное заявление. Вы не найдете mysql_stmt_init(), mysql_stmt_prepare() или mysql_stmt_execute() в привязке MySQL API в _mysql.c .

По какой-то причине автор MySQLdb решил моделировать параметры вместо использования реальных подготовленных операторов на стороне сервера.

Для защиты от внедрения SQL пакет MySQLdb использует синтаксис строкового формата Python. Он интерполирует динамические значения в запросы SQL и применяет правильное экранирование, то есть добавляет \ перед символами кавычек, чтобы убедиться, что динамические значения не содержат разделителей строк.

См. Мой ответ на Как PyMySQL защищает пользователя от атаки SQL-инъекцией? для демонстрации.

Однако экранирование не помогает, если вам нужно использовать динамические значения для числовых констант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...