我如何使用 pdo->prefer 在此代码中处理 sql 注入?

Posted

技术标签:

【中文标题】我如何使用 pdo->prefer 在此代码中处理 sql 注入?【英文标题】:how i handle sql injection in this code with pdo->prefer? 【发布时间】: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);

【问题讨论】:

【参考方案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 代码,因为您将最终重新编写自己的库,因为您会受到限制。

【讨论】:

以上是关于我如何使用 pdo->prefer 在此代码中处理 sql 注入?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eclipse PHP 上使用 PDO MySQL 并在 PHP CLI 应用程序中运行?

使用 PDO 自动提交

如何在 codeigniter 3 中使用 PDO

如何对 PDO 中的不同表使用相同的准备好的语句?

php PDO 和 mysql:如何插入地理点类型?

如何使用 PDO 从 php 文件中插入数据?