flawopen.com/SQL Injection/Что такое параметризованный запрос?
Что такое параметризованный запрос простыми словами?
Представьте бланк с подписанными полями: программа оставляет инструкции неизменными и просит библиотеку базы данных поместить каждое значение в соответствующее поле. Библиотека может использовать нативную подготовку на сервере или эмулировать её на клиенте, но код не должен переписывать инструкции данными пользователя.
Механизм
При нативной подготовке на сервере драйвер подготавливает SQL с заполнителями и передаёт привязанные значения во время выполнения. Протокол и порядок действий зависят от базы данных и драйвера. Некоторые драйверы могут эмулировать подготовку на клиенте; PDO явно документирует такой режим. Поэтому по одному вызову API нельзя понять, как передаётся значение. Не меняйте структуру SQL, используйте документированный API привязки драйвера и проверьте, активен ли нативный или эмулируемый режим.
Чем это отличается от простого «аккуратного экранирования»
При ручном экранировании код приложения должен правильно кодировать значения до их конкатенации; это ненадёжно и зависит от контекста. API параметров передаёт обработку значений драйверу. При нативной подготовке на сервере значения передаются отдельными параметрами протокола; при эмуляции драйвер обрабатывает заполнители на клиенте. Не добавляйте пользовательский ввод в SQL-строки, которые формирует приложение, и проверьте документированное поведение привязки драйвера.
FAQ
Тесно связаны — подготовленный запрос это объект на стороне базы, созданный из фиксированной структуры запроса; параметризация это практика отдельной привязки к нему значений. Термины часто используют как синонимы.
Только для значений (данных), но не для идентификаторов вроде имён таблиц или столбцов — им нужна другая защита, обычно белый список.
Источники
- OWASP — памятка по предотвращению SQL-инъекций
- flawopen.com — SQL-инъекции (все языки)
- PHP Manual — PDO::ATTR_EMULATE_PREPARES
- MySQL Reference — COM_STMT_PREPARE
- MySQL Reference — COM_STMT_EXECUTE