Dan*_*iel 6 sql stored-procedures sql-injection prepared-statement
我正在做网络安全的一些研究,我的文章的修改者说:
"应该很清楚,为了避免SQL注入,应用程序应该使用预准备语句,存储过程和转义输入"
我的问题是:其中一种方法是不够的?好吧,准备好的语句或存储过程比简单的转义更好,但如果我使用PDO,为什么我应该转义输入或有一个存储过程?这有意义吗?
我会将修改者的措辞改为:
应该清楚的是,为了避免SQL注入,应用程序应该在插入SQL字符串之前使用预准备语句,转义输入或过滤应用程序数据.
如果您要作为参数传递,则无需转义值.实际上,您不应该,因为您将在文档中插入文字反斜杠.
当您不能使用查询参数时,需要将字符串插入到SQL语句中.例子包括:
SQL关键字,应该进行清理,但由于它们没有分隔,因此无法进行转义.
其他语法或表达式.
在准备时必须提供文字值的一些情况,例如MySQL的全文功能不支持搜索模式的参数.
存储过程不能防止SQL注入.您可以在存储过程中准备和执行不安全的动态SQL语句.有关这方面的精彩故事,请参见http://thedailywtf.com/Articles/For-the-Ease-of-Maintenance.aspx.
我在演示文稿SQL注入神话和谬误中涵盖了所有这些案例.这可能对您有用.
我还在我的书" SQL反模式:避免数据库编程的缺陷"一章中介绍了SQL注入防御.