Справочник · модуль 14 «Базы данных и SQL»
Параметры ?
Вместо склейки значений в запрос ставят знак ? и отдают значения отдельно, кортежем. Так чужой ввод не изменит запрос.
Сравнение из жизни
Как бланк с пустыми клетками: ответы пишут только в клетки.
Пример
Значение передано через знак вопроса
name = "x' OR '1'='1"
query = "SELECT secret FROM users WHERE name = ?"
print(cur.execute(query, (name,)).fetchall())[]
Учитель в уроке Склеивать запрос из текста человека опасно. Хитрый человек вместо имени вводит кусочек SQL, и запрос меняется. Слева так показаны все секреты. Это называют SQL-инъекцией. Справа значение передано через знак вопроса. База считает его только текстом и ничего не находит.
Запомнить
Знаки вопроса — как бланк с клеточками. Ответ вписывают только в клеточку, остальной текст не тронешь.
Частые ошибки новичков на этой теме
Кажется: Запрос к базе можно склеить из ввода
На самом деле: Данные передаём в запрос параметрами, а не склейкой строк.
Тема из урока 14.5 «SQL из Python» курса PythonAZ.