我如何使用pdo->;在这段代码中处理sql注入;更喜欢


how i handle sql injection in this code with pdo->prefer?

在这个函数和其他函数中,对于update、delet和insert,我如何用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);
}

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

prepare()不会有多大帮助,因为您决定创建自己的PDO包装函数。

PDO中不支持绑定列和表。

在这一点上,您将自担风险,转义字符、sql注入。。。

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

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

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

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

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

相关文章: