虽然我当然可以看到使用参数进行SQL查询的优势,特别是在处理日期时间等事情时,我仍然不确定参数是否只是 方法来阻止SQL注入。
事实是,我继承了一个应用程序,它有像
"SELECT Field FROM Table WHERE Filter='"+userinput.Replace("'", "''")+"'"
到处都是。现在虽然那些看起来不太令人愉快,但我不介意重写它们,我的问题是,我需要吗?尽我所能,我看不到用这种方式执行SQL注入的方法。
答案 0 :(得分:16)
不,这还不够。如果您的平台和/或RDBMS支持这两种功能,那么它将会很紧凑,但它是一种非常弱的替代方案,使用参数化查询或参数化存储过程会更好。
来自
OWASP's SQL Injection Prevention Cheat Sheet
...与使用参数化查询相比,这种方法很脆弱。 只应谨慎使用此技术来改进遗留问题 以经济有效的方式编写代码。
以下还有更多内容
SQL injection — but why isn't escape quotes safe anymore?
Sql Injection Myths and Fallacies
SQL Injection after removing all single-quotes and dash-characters
答案 1 :(得分:3)
是的,.Replace("'", "''")
将SQL注入停止到与参数化相同的程度。
还有双重或反射注射。例如,您可以存储
'; delete from orders'
在评论字段中。如果数据库的一部分使用动态SQL中的注释字段,则可能会运行删除。
答案 2 :(得分:2)
如果用户只需要对数据的只读访问权限,那么通过只具有只读访问权限的SQL用户执行UI。只读不会保护您免受注入攻击 - 他们可以使用它来查看您不打算查看的数据,但是他们不能使用注入来删除数据。
答案 3 :(得分:1)
我认为你得到的答案就是为什么它还不够,但你也遇到了某人忘记对字符串进行替换的问题。如果你“总是”使用参数,这不是一个问题。
答案 4 :(得分:0)
使用程序。
将语句转换为静态SQL,将参数值放入局部变量。
这确实有帮助!