Нужно ли использовать mysql_real_escape_string()
на моем входе (например, $_POST
и $_GET
), когда я использую PDO библиотека?
Как правильно избежать ввода пользователя с помощью PDO?
Нужно ли использовать mysql_real_escape_string()
на моем входе (например, $_POST
и $_GET
), когда я использую PDO библиотека?
Как правильно избежать ввода пользователя с помощью PDO?
Если вы используете PDO, вы можете параметризовать свои запросы, устраняя необходимость избегать любых включенных переменных.
Смотрите здесь для отличного вводного учебника для PDO.
Используя PDO, вы можете разделить SQL и передать параметры с помощью подготовленных операторов, это избавит вас от необходимости избегать строк, поскольку, поскольку они выполняются отдельно, а затем объединены при выполнении, параметры автоматически обрабатываются как укусы из указанного выше источника:
// where $dbh is your PDO connection
$stmt = $dbh->prepare("SELECT * FROM animals WHERE animal_id = :animal_id AND animal_name = :animal_name");
/*** bind the paramaters ***/
$stmt->bindParam(':animal_id', $animal_id, PDO::PARAM_INT);
$stmt->bindParam(':animal_name', $animal_name, PDO::PARAM_STR, 5);
/*** execute the prepared statement ***/
$stmt->execute();
Примечание: санификация происходит во время привязки переменных ($stmt->bindParam
)
Другие ресурсы:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
http://www.phpeveryday.com/articles/PDO-Prepared-Statement-P550.html
Важным моментом при использовании PDO является:
PDO будет дезинфицировать его только для SQL, а не для вашего приложения.
Итак, для записей, таких как INSERT или UPDATE, особенно важно, чтобы все еще сначала фильтровать ваши данные и дезинформировать их для других вещей (удаление HTML-тегов, JavaScript и т.д.).
<?php
$pdo = new PDO(...);
$stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- filter your data first
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING); // <-- filter your data first
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- Automatically sanitized for SQL by PDO
$stmt->bindParam(':name', $name, PDO::PARAM_STR); // <-- Automatically sanitized for SQL by PDO
$stmt->execute();
Без дезинфекции пользовательского ввода, хакер мог бы сохранить некоторый javascript в вашей базе данных, а затем, выведя его на свой сайт, вы подверглись бы угрозе!