这是一个针对PDO预准备语句的安全问题。使用PDO,我知道sql注入的风险几乎是不可能的,而且这个类可以为您处理所有的风险。由于使用了mysql_*堆栈,我总觉得自己在处理安全问题上做得不够好。我通常习惯于编写数百行代码来处理安全问题,而现在我只是在编写查询。
除了db中字符串的长度之外,PDO语句是否真的存在任何我必须担心的安全威胁?
发布于 2013-04-13 13:18:13
肯定是这样的。
事实上,本机预准备语句只适用于简单的教科书案例。
这意味着对于任何复杂的情况,您仍然需要编写一些“数百行”。我在PDO tag wiki中对这种情况做了一个小小的总结。主要缺点是
因此,即使在PDO上,您也需要更高级别的抽象。一种常见的解决方案是使用由每个现代框架提供的某种类型的查询生成器。
但就我个人而言,我讨厌查询构建器,因为它们在我看来过于臃肿,假装要替换整个SQL,但显然失败了。所以,当我可以使用纯SQL时,我不明白为什么要使用用PHP编写的SQL。为此,我创建了自己的抽象库,以纠正本机预准备语句的所有缺点,即safeMysql。它为您所需的一切提供了占位符,因此使查询比PDO安全得多,但它大大缩短了应用程序代码。
意思是使用safeMysql you 确实可以“按字面意思写查询”:
$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-13 12:21:48
我认为对于"sql注入攻击“,答案几乎是肯定的。mysqli prepared statements and mysqli_real_escape_string
还有许多其他类型的攻击,但至少您的所有值都被转义。
依赖PDO来“修复”您的安全性就像依赖编译器来查找错误一样。
https://stackoverflow.com/questions/15983616
复制相似问题