Выбор ответа Junior Безопасность веб-приложения спрашивают часто обновлено

Как защититься от SQL-инъекции

Вопрос

Какой вызов защищён от SQL-инъекции?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: cursor.execute('SELECT FROM users WHERE email = %s', [email]). Параметризованный запрос передаёт значение драйверу отдельно от текста SQL, и оно никогда не становится частью кода запроса. f-строка, оператор % и склейка с repr подставляют ввод прямо в SQL, и строка вида ' OR 1=1 -- меняет смысл…

Варианты ответа

  1. cursor.execute(f"SELECT * FROM users WHERE email = '{email}'")
  2. cursor.execute('SELECT * FROM users WHERE email = \'%s\'' % email)
  3. cursor.execute('SELECT * FROM users WHERE email = %s', [email])правильный ответ
  4. cursor.execute('SELECT * FROM users WHERE email = ' + repr(email))

Разбор

Параметризованный запрос передаёт значение драйверу отдельно от текста SQL, и оно никогда не становится частью кода запроса. f-строка, оператор % и склейка с repr подставляют ввод прямо в SQL, и строка вида ' OR 1=1 -- меняет смысл запроса. repr не экранирует по правилам SQL. Внешне %s в первом варианте похож на форматирование, но это плейсхолдер драйвера, а значения переданы вторым аргументом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме