Почему PHP PDO не защищает мой запрос от внедрения? - PullRequest
2 голосов
/ 24 ноября 2011

Я все еще продолжаю изучать PDO полностью, но я был немного удивлен, когда проверил сегодня вечером, работает ли он для SQL Inject, и к моему удивлению, это сработало. Итак, я начал думать; объявленные значения должны автоматически очищаться с использованием подготовленных PDO операторов, что означает, что в моем запросе SQL должно быть что-то не так, я прав?

У меня есть страница, для которой нужна переменная GET, чтобы собрать соответствующие данные из моей базы данных с этим идентификатором. Я создал функцию, которая включает в себя подготовку запроса, а также его выполнение для упрощения процесса кодирования. Код, который я сейчас написал, выглядит так:

 $request = $_GET['movie'];
 $sql = "SELECT * FROM `movies` WHERE `url` = '$request'";
 $db = new database;
 $db->setDBC();

 $process = $db->executeQuery($sql);
 $cmd = $process->fetch(PDO::FETCH_NUM);

 $title = $cmd[1];

И исключение PDO, которое я получаю:

Неустранимая ошибка: необработанное исключение «PDOException» с сообщением «SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL имеется ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '21 -31282 'в строке 1 в C: \ xampp \ htdocs \ filmvote \ include \ databaseClass.php: 33 Трассировка стека: # 0 C: \ xampp \ htdocs \ filmvote \ include \ databaseClass.php (33): PDOStatement-> execute () # 1 C: \ xampp \ htdocs \ filmvote \ recension.php (9): databaseManagement-> executeQuery ('SELECT) * FROM `... ') # 2 {main}, брошенный в C: \ xampp \ htdocs \ filmvote \ include \ databaseClass.php в строке 33

Вы получаете такую ​​ошибку при добавлении ' or 1-1 к URL. Что я могу сделать по этому поводу? Очень благодарен за помощь.

Ответы [ 2 ]

13 голосов
/ 24 ноября 2011

проведенные значения должны автоматически очищаться с использованием PDO

Нет. Только если вы используете фактически подготовленные утверждения, например, так:

$stmt = $dbh->prepare("SELECT * FROM `movies` WHERE `url` = ?");
if ($stmt->execute(array($_GET['movie'])))  // <-- This sanitizes the value
  { 
    // do stuff
  }

Будут ли автоматически вставлены введенные вами значения и ваш запрос защищен от внедрения SQL.

В противном случае ваш SQL-запрос будет выполнен как любой старый mysql_query() и уязвим. PDO не может принять запрос и затем автоматически очистить уязвимые части. Это невозможно.

3 голосов
/ 24 ноября 2011

Попробуйте подготовленные утверждения:

$query = $db->prepare("SELECT * FROM `movies` WHERE url = ?");
$query->execute(array($request));
$result = $query->fetch(PDO::FETCH_ASSOC);
...