4

这是一个针对 PDO 准备语句的安全问题。使用 PDO 我知道 sql 注入的风险几乎是不可能的,并且该类会为您处理所有这些。使用它们 mysql_* 堆栈后,我总觉得好像我没有很好地处理安全问题。我通常习惯于编写数百行代码来处理安全问题,而现在我实际上只是在编写查询。

除了数据库中字符串的长度之外,我必须担心 PDO 语句是否真的存在任何安全威胁?

4

2 回答 2

2

肯定是的。

事实上,原生准备语句仅适用于简单的教科书案例。
意味着您仍然需要为任何复杂的情况编写一些“数百行”。我在PDO 标签 wiki中对此类案例做了一个小摘要。主要缺点是

  • 没有标识符的占位符。您必须像在旧的良好 mysql_* 代码中一样手动格式化和注入它们。
  • 没有数组的占位符。意味着您仍然必须手动编写一些代码,然后将其注入查询中 - 因此,仍有可能陷入一些麻烦。

因此,即使在 PDO 上,您也需要更高级别的抽象。一个常见的解决方案是使用每个现代框架都提供的某种查询构建器。

但我个人讨厌查询构建器,因为它们在我看来过于臃肿,假装替换整个 SQL 但显然失败了。所以,当我可以使用纯 SQL 时,我不明白为什么要使用用 PHP 编写的 SQL。为此,我创建了一个抽象库,以纠正本机准备语句的所有缺点safeMysql。它为您需要的所有内容提供占位符,因此使查询比 PDO 更安全,但它使应用程序代码大大缩短。

使用 safeMysql 意味着您确实可以“直接写查询”:

$sql  = "SELECT * FROM articles WHERE id IN(?a) ORDER BY ?n LIMIT ?i"
$data = $db->getAll($sql, $ids,$_GET['order'], $limit);

$sql  = "INSERT INTO stats SET pid=?i,ip=inet_aton(?s),?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql, $pid, $ip, $data, $data);

只需将这些 2 行代码与您需要使用原始 PDO 编写的代码量进行比较。

于 2013-04-13T05:18:12.683 回答
0

我认为“sql 注入攻击”的答案非常接近肯定。 mysqli 准备好的语句和 mysqli_real_escape_string

还有许多其他类型的攻击,但至少您的所有值都被转义了。

依靠 PDO 来“修复”您的安全性就像依靠编译器来查找错误一样。

于 2013-04-13T04:21:47.843 回答