Справочник · модуль 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.

В этом же уроке