Строго говоря, на самом деле экранирования не требуется, поскольку значение параметра никогда не интерполируется в строку запроса.
Способ работы параметров запроса заключается в том, что запрос отправляется на сервер базы данных при вызове prepare()
, а значения параметров отправляются позже, когда вы вызываете execute()
. Таким образом, они хранятся отдельно от текстовой формы запроса. Никогда не существует возможности для внедрения SQL (при условии, что PDO::ATTR_EMULATE_PREPARES
имеет значение false).
Так что да, параметры запроса помогут вам избежать этой формы уязвимости безопасности.
Являются ли они на 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.