防止SQL注入 - 如果使用预准备语句,为什么要逃避输入?

Dan*_*iel 6 sql stored-procedures sql-injection prepared-statement

我正在做网络安全的一些研究,我的文章的修改者说:

"应该很清楚,为了避免SQL注入,应用程序应该使用预准备语句,存储过程和转义输入"

我的问题是:其中一种方法是不够的?好吧,准备好的语句或存储过程比简单的转义更好,但如果我使用PDO,为什么我应该转义输入或有一个存储过程?这有意义吗?

Bil*_*win 8

我会将修改者的措辞改为:

应该清楚的是,为了避免SQL注入,应用程序应该在插入SQL字符串之前使用预准备语句,转义输入或过滤应用程序数据.

如果您要作为参数传递,则无需转义值.实际上,您不应该,因为您将在文档中插入文字反斜杠.

当您不能使用查询参数时,需要将字符串插入到SQL语句中.例子包括:

  • 表名和列名,它们具有分隔标识符自己的语法.这些必须是准备时SQL查询的一部分,因此RDBMS可以解析和验证它们.

  • SQL关键字,应该进行清理,但由于它们没有分隔,因此无法进行转义.

  • 其他语法或表达式.

  • 在准备时必须提供文字值的一些情况,例如MySQL的全文功能不支持搜索模式的参数.

存储过程不能防止SQL注入.您可以在存储过程中准备和执行不安全的动态SQL语句.有关这方面的精彩故事,请参见http://thedailywtf.com/Articles/For-the-Ease-of-Maintenance.aspx.

我在演示文稿SQL注入神话和谬误中涵盖了所有这些案例.这可能对您有用.

我还在我的书" SQL反模式:避免数据库编程的缺陷"一章中介绍了SQL注入防御.