FlawOpen

flawopen.com/SQL Injection/Что такое параметризованный запрос?

Что такое параметризованный запрос простыми словами?

Справочная страница
Простыми словами

Представьте бланк с подписанными полями: программа оставляет инструкции неизменными и просит библиотеку базы данных поместить каждое значение в соответствующее поле. Библиотека может использовать нативную подготовку на сервере или эмулировать её на клиенте, но код не должен переписывать инструкции данными пользователя.

Механизм

При нативной подготовке на сервере драйвер подготавливает SQL с заполнителями и передаёт привязанные значения во время выполнения. Протокол и порядок действий зависят от базы данных и драйвера. Некоторые драйверы могут эмулировать подготовку на клиенте; PDO явно документирует такой режим. Поэтому по одному вызову API нельзя понять, как передаётся значение. Не меняйте структуру SQL, используйте документированный API привязки драйвера и проверьте, активен ли нативный или эмулируемый режим.

Чем это отличается от простого «аккуратного экранирования»

При ручном экранировании код приложения должен правильно кодировать значения до их конкатенации; это ненадёжно и зависит от контекста. API параметров передаёт обработку значений драйверу. При нативной подготовке на сервере значения передаются отдельными параметрами протокола; при эмуляции драйвер обрабатывает заполнители на клиенте. Не добавляйте пользовательский ввод в SQL-строки, которые формирует приложение, и проверьте документированное поведение привязки драйвера.

FAQ

Это то же самое, что «подготовленный запрос»?

Тесно связаны — подготовленный запрос это объект на стороне базы, созданный из фиксированной структуры запроса; параметризация это практика отдельной привязки к нему значений. Термины часто используют как синонимы.

Работает ли это для любой части запроса?

Только для значений (данных), но не для идентификаторов вроде имён таблиц или столбцов — им нужна другая защита, обычно белый список.

Источники

См. также SQL-инъекции (CWE-89): как они работают и как их предотвратить в любом языке — flawopen.com Защищает ли Prisma $queryRaw от SQL-инъекций? Безопасна ли интерполяция в Rails where()? Защищает ли Sequelize query() от SQL-инъекций? Защищает ли SQLAlchemy text() от SQL-инъекций? Предотвращает ли проверка sqlx при компиляции SQL-инъекции? Защищают ли хранимые процедуры от SQL-инъекций?