这是一个针对PDO准备语句的安全问题.使用PDO我知道SQL注入的风险几乎是不可能的,并且该类为您处理所有这些.使用它们
mysql_ * stack我总觉得好像我没有很好地处理安全问题.我通常习惯于编写数百行代码来处理安全问题,而现在我只是编写查询.
除了db中的字符串长度之外,我是否还要担心PDO语句存在任何安全威胁?
最佳答案 肯定是的.
事实上,本地准备的陈述仅适用于简单的教科书案例.
意味着你仍然需要为任何复杂的情况写一些“数百行”.我在PDO tag 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编写的代码量进行比较.