这是一个针对 PDO 准备语句的安全问题。使用 PDO 我知道 sql 注入的风险几乎是不可能的,并且该类会为您处理所有这些。使用它们 mysql_* 堆栈后,我总觉得好像我没有很好地处理安全问题。我通常习惯于编写数百行代码来处理安全问题,而现在我实际上只是在编写查询。
除了数据库中字符串的长度之外,我必须担心 PDO 语句是否真的存在任何安全威胁?
肯定是的。
事实上,原生准备语句仅适用于简单的教科书案例。
意味着您仍然需要为任何复杂的情况编写一些“数百行”。我在PDO 标签 wiki中对此类案例做了一个小摘要。主要缺点是
因此,即使在 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 编写的代码量进行比较。
我认为“sql 注入攻击”的答案非常接近肯定。 mysqli 准备好的语句和 mysqli_real_escape_string
还有许多其他类型的攻击,但至少您的所有值都被转义了。
依靠 PDO 来“修复”您的安全性就像依靠编译器来查找错误一样。