为什么PHP PDO不保护我的查询不被注入?

为什么PHP PDO不保护我的查询不被注入?,php,sql,pdo,sql-injection,prepared-statement,Php,Sql,Pdo,Sql Injection,Prepared Statement,我仍在全面学习PDO,但当我今晚检查它是否对SQL注入URL参数有效时,我有点惊讶,令我惊讶的是,它确实有效。于是我开始思考;应该使用PDO准备的语句自动清理发布的值,这意味着我的SQL查询一定有问题,对吗 我有一个页面需要一个GET变量,以便从我的数据库中收集具有该ID的相应数据。我创建了一个函数,该函数包括准备查询以及执行查询以简化编码过程。我现在编写的代码如下所示: $request = $_GET['movie']; $sql = "SELECT * FROM `movies` WH

我仍在全面学习PDO,但当我今晚检查它是否对SQL注入URL参数有效时,我有点惊讶,令我惊讶的是,它确实有效。于是我开始思考;应该使用PDO准备的语句自动清理发布的值,这意味着我的SQL查询一定有问题,对吗

我有一个页面需要一个GET变量,以便从我的数据库中收集具有该ID的相应数据。我创建了一个函数,该函数包括准备查询以及执行查询以简化编码过程。我现在编写的代码如下所示:

 $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服务器版本对应的手册,以了解在C:\xampp\htdocs\filmvote\include\databaseClass.php:33堆栈跟踪:0 C:\xampp\htdocs\filmvote\include\databaseClass.php33:PDOStatement->execute 1 C:\xampp\htdocs\filmvote\recension.php9:databaseManagement->->executeQuery中使用的语法是否正确*从第33行C:\xampp\htdocs\filmvote\include\databaseClass.php中抛出的“…”2{main}”

在URL中添加“或1-1”时会出现这种错误。我能做些什么?非常感谢你的帮助

应该使用PDO自动清除发布的值

没有。仅当您使用实际准备的报表时,如:

$stmt = $dbh->prepare("SELECT * FROM `movies` WHERE `url` = ?");
if ($stmt->execute(array($_GET['movie'])))  // <-- This sanitizes the value
  { 
    // do stuff
  }
您插入的值将被自动清除,并且您的查询将受到SQL注入的保护


否则,您的SQL查询将像任何旧的mysql_查询一样执行,并且易受攻击。PDO不能接受查询,然后自动清理易受攻击的部分。这是不可能的。

尝试准备好的语句:

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

这不是事先准备好的声明