【问题标题】:how i handle sql injection in this code with pdo->prefer?我如何使用 pdo->prefer 在此代码中处理 sql 注入?
【发布时间】:2014-11-22 22:36:11
【问题描述】:

在这个函数和其他函数中,如更新、删除和插入,我如何使用 pdo->prefer 处理这段代码中的 sql 注入?

function get_rows($fields = '*', $where = ' 1=1 ') {
$this->_query = "select $fields from {$this->table} where {$where}";
$stm = $this->_pdo->query($this->_query);
if(!$stm)
die(var_export($this->_pdo->errorinfo(), TRUE));
else
return $stm->fetchAll();}


function insert($fields, $data) {
    $this->_query = " insert into $this->table ($fields) VALUES ($data)";
    $this->_pdo->exec($this->_query);
}

【问题讨论】:

    标签: php pdo sql-injection


    【解决方案1】:

    取自PDO的prepared statement的API文档:

    首先,使用占位符创建一个准备好的语句。接下来,将占位符与您的变量绑定,并调用 PDO 提供的执行方法。

    所以你的函数可能看起来像:

    function insert($fields, $data) {
       $stmt = $dbh->prepare("INSERT INTO ".$this->table ."(fields, values) VALUES (:fields, :values)");
       $stmt->bindParam(':fields', $fields);
       $stmt->bindParam(':fields', $values);
       $stmt->execute();
    

    }

    请注意,如果您必须进行一些额外的调整,这取决于您提供名称和值参数的准确程度,但我希望您能从示例中获得要点。使用bindParam绑定prepared语句中的参数,然后执行。

    【讨论】:

      【解决方案2】:

      prepare() 无济于事,因为您决定创建自己的 PDO 包装函数。

      PDO 不支持绑定列和表。

      此时您需要自担风险,转义字符,sql 注入...

      对于表和列来说可能是可以理解的,你可以使用硬编码字符串数组,如果找不到就抛出错误:

      if (!in_array($field, $list_of_fields)) {
          throw new MyPDOException('Field not found');
      }
      

      至于价值,你必须做一些工作来清理它们,所以你看到很多你不必做的工作?

      也许这是一个简单的 CRUD 应用程序,但如果您必须运行 JOIN 查询怎么办?你要为此创建一个函数吗?

      会变得一团糟,我建议您编写纯 PDO 代码,因为您将最终重新编写自己的库,因为您会受到限制。

      【讨论】:

        猜你喜欢
        • 2011-10-18
        • 2010-12-20
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 2021-07-27
        相关资源
        最近更新 更多