我如何处理这段代码中的sql注入与pdo-> prefer?

时间:2014-09-28 11:51:01

标签: php pdo sql-injection

在这个函数,以及其他函数,如更新,删除和插入,如何在这个代码中用pdo->来处理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);
}

2 个答案:

答案 0 :(得分:0)

取自PDO准备好的声明的API文档:

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

所以你的功能可能如下:

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绑定预准备语句中的参数,然后执行它。

答案 1 :(得分:0)

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

PDO中不支持绑定列和表。

此时你将面临自己的风险,逃避角色,sql注入......

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

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

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

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

它会变得混乱,我建议你编写纯PDO代码,因为当你受限时,你最终会重新编写自己的库。