SQL注入:不是替换(“'”,“''”)足够好吗?

时间:2011-12-14 14:58:05

标签: sql-server tsql

虽然我当然可以看到使用参数进行SQL查询的优势,特别是在处理日期时间等事情时,我仍然不确定参数是否只是 方法来阻止SQL注入。
事实是,我继承了一个应用程序,它有像

这样的东西
"SELECT Field FROM Table WHERE Filter='"+userinput.Replace("'", "''")+"'"
到处都是。现在虽然那些看起来不太令人愉快,但我不介意重写它们,我的问题是,我需要吗?尽我所能,我看不到用这种方式执行SQL注入的方法。

5 个答案:

答案 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,将参数值放入局部变量。

这确实有帮助!