首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中使用准备好的语句/存储过程时,如何防止SQL注入?

在PHP中使用准备好的语句/存储过程时,如何防止SQL注入?
EN

Stack Overflow用户
提问于 2011-06-30 10:14:47
回答 2查看 1.3K关注 0票数 4

自阅读此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不够的实例吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-30 11:32:12

您仍然可以从存储过程获得SQL注入,这些存储过程内部使用准备语法(在MySQL中)来创建动态SQL语句。

这些都需要非常小心地进行,必要时使用引号()。

理想情况下,我们不应该在存储的例程中使用准备,但在某些情况下,很难避免:

  • 在MySQL 5.5之前,MySQL子句不能使用非常量值。IN()子句中使用的
  • 列表不能(明智地)参数化,因此需要使用动态MySQL,如果使用
  • ,有时需要使用动态生成的ORDER子句。

在有必要使用准备的情况下,我建议按优先顺序:

如果某事是INT类型(等),它不会受到SQL注入的影响,您可以将值放入查询中,而不会出现问题(例如,LIMIT)

  • String值可以在执行之前放置到@变量中,或者传递给执行clause

  • List-values (例如,IN()),因为validity.

  • Finally,引号()可以用于引用字符串值,在某些情况下,字符串值在

中很有用。

票数 3
EN

Stack Overflow用户

发布于 2011-06-30 10:16:54

这不是您使用的结构(存储过程、准备好的语句等)。这是决定性的,但是您是否在任何时候使用未检查的用户输入将SQL连接在一起。例如,您可以在存储过程中执行动态SQL,在这种情况下,危险仍然存在。

最简单的方法(从注入避免角度来看)是使用带有绑定变量的SPs或PSs :这些变量不需要检查,因为它们将被识别为在预定义占位符中的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6533239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档