我如何使用 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 注入?的主要内容,如果未能解决你的问题,请参考以下文章