我一直在研究如何最好地防止PHP / mysql中的sql注入,而不仅仅是使用mysqli / mysql真正的转义,因为阅读此Is mysql_real_escape_string enough to Anti SQL Injection?
我见过这个非常好的帖子How can I prevent SQL injection in PHP?
我用来在桌面/内部工具上做很多ms sql server的东西,我们总是编写存储过程来防止这种情况所以我在PHP / mysql中使用PDO http://php.net/manual/en/pdo.prepared-statements.php
在上面有一行:
不需要引用准备语句的参数;驱动程序自动处理这个。如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分是使用非转义输入构建的,则仍然可以进行SQL注入)。
我一直认为PDO可以防止sql注入攻击,所以有人可以从安全的角度提供PDO不足的实例吗?
答案 0 :(得分:3)
您仍然可以从内部使用PREPARE语法(在MySQL中)创建动态SQL语句的存储过程中获取SQL注入。
这些需要非常小心,必要时使用QUOTE()。
理想情况下,我们不需要在存储例程中使用PREPARE,但在某些情况下,它很难避免:
等
如果需要使用PREPARE,我建议按优先顺序排列:
答案 1 :(得分:1)
您使用的结构(存储过程,预处理语句等)不是决定性的,而是您是否在任何时候使用未经检查的用户输入将SQL连接在一起。例如,您可以在存储过程中执行动态SQL,在这种情况下,危险仍然存在。
最简单的方法(从注入避免的角度来看)是使用带有限制变量的SP或PS:不需要检查它们,因为它们将被识别为在预定义占位符内的值。 / p>