Начал работу с подготовленными инструкциями 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.