自阅读此Is mysql_real_escape_string enough to Anti SQL Injection?以来,我一直在研究如何更好地防止PHP/mysql中的sql注入,而不仅仅是使用mysqli/mysql真正的转义。
我看过这个非常好的线程How can I prevent SQL injection in PHP?
我经常在桌面/内部工具上做ms sql server的内容,我们总是编写存储过程来防止这种情况,所以我使用PDO http://php.net/manual/en/pdo.prepared-statements.php阅读了PHP/mysql中的等价物。
在上面有一行:
准备语句的参数不需要引用;驱动程序会自动处理这个问题。如果应用程序只使用已准备好的语句,则开发人员可以确保不会发生SQL注入(但是,如果使用未转义的输入构建查询的其他部分,则SQL注入仍然是可能的)。
我被引导相信PDO确实可以防止sql注入攻击,所以从安全的角度来看,任何人都能提供PDO不够的实例吗?
发布于 2011-06-30 11:32:12
您仍然可以从存储过程获得SQL注入,这些存储过程内部使用准备语法(在MySQL中)来创建动态SQL语句。
这些都需要非常小心地进行,必要时使用引号()。
理想情况下,我们不应该在存储的例程中使用准备,但在某些情况下,很难避免:
。
等
在有必要使用准备的情况下,我建议按优先顺序:
如果某事是INT类型(等),它不会受到SQL注入的影响,您可以将值放入查询中,而不会出现问题(例如,LIMIT)
中很有用。
发布于 2011-06-30 10:16:54
这不是您使用的结构(存储过程、准备好的语句等)。这是决定性的,但是您是否在任何时候使用未检查的用户输入将SQL连接在一起。例如,您可以在存储过程中执行动态SQL,在这种情况下,危险仍然存在。
最简单的方法(从注入避免角度来看)是使用带有绑定变量的SPs或PSs :这些变量不需要检查,因为它们将被识别为在预定义占位符中的值。
https://stackoverflow.com/questions/6533239
复制相似问题