这是一个针对PDO准备语句的安全问题。使用PDO我知道SQL注入的风险几乎是不可能的,并且该类为您处理所有这些。使用它们mysql_ * stack我总觉得好像我没有很好地处理安全问题。我通常习惯于编写数百行代码来处理安全问题,而现在我只是编写查询。
对于PDO语句是否真的存在任何安全威胁,除了db中的字符串长度之外我还要担心吗?
答案 0 :(得分:2)
肯定是的。
事实上,本土预备陈述仅适用于简单的教科书案件 意味着你仍然需要为任何复杂的情况写一些“数百行”。我在PDO tag wiki中对这些案例做了一个小摘要。主要缺点是
因此,即使在PDO上,您也需要更高级别的抽象。一个常见的解决方案是使用某种 Query Builder ,它们由每个现代框架提供。
但我个人讨厌查询构建器,因为它们对我来说似乎太臃肿了,假装替换整个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编写的代码量进行比较。
答案 1 :(得分:0)
我认为答案与“sql注入攻击”非常接近。 mysqli prepared statements and mysqli_real_escape_string
还有许多其他类型的攻击,但至少所有值都被转义。
依靠PDO“修复”您的安全性就像依靠编译器来查找您的错误。