Нужно ли использовать 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 в вашей базе данных, а затем, выведя его на свой сайт, вы подверглись бы угрозе!