Насколько безопасны подготовленные заявления PDO? - PullRequest
40 голосов
/ 22 августа 2009

Начал использовать подготовленные 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();

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

Спасибо.

Ответы [ 4 ]

76 голосов
/ 22 августа 2009

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

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

10 голосов
/ 22 августа 2009

Это безопасно от внедрения SQL.

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

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

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

2 голосов
/ 22 августа 2009

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

1 голос
/ 26 августа 2009

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

...