насколько безопасны подготовленные заявления PDO

Начал работу с подготовленными инструкциями PDO не так давно, и, насколько я понимаю, он делает все возможное для вас.

например, если $ _POST ['title'] является полем формы.

$title = $_POST['title']; $query = "insert into blog(userID, title) values (?, ?)" $st = $sql->prepare($query); $st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT); $st->bindParam(2, $title); $st->execute(); 

Это действительно безопасно? Нужно ли мне что-то делать? что еще я должен принять во внимание?

Благодарю.

Строго говоря, на самом деле не требуется экранирование, потому что значение параметра никогда не интерполируется в строку запроса.

Способ работы параметров запроса заключается в том, что запрос отправляется на сервер базы данных при вызове 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.

Это безопасно от SQL-инъекции.

Пара вещей, в которых это НЕ безопасно:

  • Отказ в обслуживании (вызывающий чрезмерное количество строк, которые должны быть созданы)
  • Атаки межсайтового скриптинга (если заголовок всегда повторяется обратно другому пользователю)

Безопасность – это больше, чем просто предотвращение внедрения SQL.

Что касается SQL Injections, я считаю, что это самое безопасное, что вы можете получить, особенно если вы используете такие константы, как PDO :: PARAM_INT.

Увидев, что XSS упоминается, я думаю, что также полезно взглянуть на такие вещи, как этот класс очистки ввода http://www.phpclasses.org/browse/package/2189.html, чтобы предотвратить атаки XSS.