Ответ 1
Строго говоря, на самом деле не требуется экранирование, потому что значение параметра никогда не интерполируется в строку запроса.
Как работают параметры запроса, запрос отправляется на сервер базы данных при вызове prepare()
, а значения параметров отправляются позже, когда вы вызываете execute()
. Таким образом, они сохраняются отдельно от текстовой формы запроса. Там никогда не было возможности для SQL-инъекций (при условии, что PDO::ATTR_EMULATE_PREPARES
является ложным).
Итак, параметры запроса помогают избежать такой уязвимости безопасности.
Являются ли они 100% доказательством против любой уязвимости безопасности? Нет, конечно нет. Как вы знаете, параметр запроса заменяет только одно значение литерала в выражении SQL. Вы не можете сделать замену одного параметра для списка значений, например:
SELECT * FROM blog WHERE userid IN ( ? );
Вы не можете использовать параметр, чтобы динамические имена таблиц или столбцов:
SELECT * FROM blog ORDER BY ?;
Вы не можете использовать параметр для синтаксиса другого типа SQL:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Таким образом, существует довольно много случаев, когда вам нужно манипулировать запросом в виде строки до вызова prepare()
. В этих случаях вам все равно нужно писать код, чтобы избежать инъекции SQL.