为什么PHP PDO不保护我的查询不被注入?
我仍在全面学习PDO,但当我今晚检查它是否对SQL注入URL参数有效时,我有点惊讶,令我惊讶的是,它确实有效。于是我开始思考;应该使用PDO准备的语句自动清理发布的值,这意味着我的SQL查询一定有问题,对吗 我有一个页面需要一个GET变量,以便从我的数据库中收集具有该ID的相应数据。我创建了一个函数,该函数包括准备查询以及执行查询以简化编码过程。我现在编写的代码如下所示:为什么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
$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);
这不是事先准备好的声明