【问题标题】:Why isn't PHP PDO protecting my query from injection?为什么 PHP PDO 不能保护我的查询不被注入?
【发布时间】:2011-11-23 20:28:36
【问题描述】:

我仍在全面学习 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 中的 ''21-31282 ''' at line 1' 附近使用正确的语法 堆栈跟踪:# 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} 在第 33 行的 C:\xampp\htdocs\filmvote\include\databaseClass.php 中抛出

' or 1-1 添加到 URL 时会出现这种错误。我能做些什么呢?真的很感谢帮助。

【问题讨论】:

  • 这不是准备好的语句

标签: php sql pdo sql-injection prepared-statement


【解决方案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_query() 一样执行,并且容易受到攻击。 PDO 不能进行查询,然后自动清理易受攻击的部分。这是不可能的。

【讨论】:

    【解决方案2】:

    尝试准备好的语句:

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

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 1970-01-01
      • 2015-08-20
      • 2019-10-09
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多