Как санировать ввод с помощью PDO? - PullRequest
17 голосов
/ 06 декабря 2010

Нужно ли использовать mysql_real_escape_string() на моем входе (например, $_POST и $_GET) при использовании библиотеки PDO ?

Как правильно избежать пользовательского ввода с помощью PDO?

Ответы [ 2 ]

28 голосов
/ 06 декабря 2010

Если вы используете 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

http://php.net/manual/en/pdo.prepared-statements.php

6 голосов
/ 11 мая 2016

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

http://www.phptherightway.com/#pdo_extension

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...