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

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

Спасибо.

Ответ 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.

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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