Выбор ответа Junior Безопасность веб-приложения спрашивают часто обновлено
Как защититься от SQL-инъекции
Вопрос
Какой вызов защищён от SQL-инъекции?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: cursor.execute('SELECT FROM users WHERE email = %s', [email]). Параметризованный запрос передаёт значение драйверу отдельно от текста SQL, и оно никогда не становится частью кода запроса. f-строка, оператор % и склейка с repr подставляют ввод прямо в SQL, и строка вида ' OR 1=1 -- меняет смысл…
Варианты ответа
cursor.execute(f"SELECT * FROM users WHERE email = '{email}'")cursor.execute('SELECT * FROM users WHERE email = \'%s\'' % email)cursor.execute('SELECT * FROM users WHERE email = %s', [email])правильный ответcursor.execute('SELECT * FROM users WHERE email = ' + repr(email))
Разбор
Параметризованный запрос передаёт значение драйверу отдельно от текста SQL, и оно никогда не становится частью кода запроса. f-строка, оператор % и склейка с repr подставляют ввод прямо в SQL, и строка вида ' OR 1=1 -- меняет смысл запроса. repr не экранирует по правилам SQL. Внешне %s в первом варианте похож на форматирование, но это плейсхолдер драйвера, а значения переданы вторым аргументом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.