带参数化过程的SQL注入

时间:2017-01-09 13:14:45

标签: sql-server security sql-injection

需要一些关于这个SQL注入问题的帮助:

以下是参数化存储过程的一个版本。排除从应用程序调用它的方式,无论如何都要阻止@v_string被视为动态SQL吗?

我认为这是相当紧张的 - 没有执行或连接的sql,但仍然插入分号允许返回其他数据。

我知道有多个级别可以考虑这个问题,但我想知道是否有一些简单的解决方案我在这里缺少,因为大多数注入修复都涉及动态查询。

re.sub

2 个答案:

答案 0 :(得分:2)

  

无论如何都要阻止@v_string被视为动态的   SQL?

我不希望@v_string在这里被视为动态SQL,因为T-SQL代码没有EXECUTEEXECUTE sp_executeSQL。该值不会被执行,但会被视为不易受SQL注入影响的WHERE子句值。

如果这没有回答您的问题,请发布一个完整的示例,演示将该值视为动态SQL。

答案 1 :(得分:2)

您对自己的测试感到困惑。这一行:

 set @v_string='test'''; waitfor delay '0:0:5' -- 

创建一个值为@v_string的字符串test',然后执行waitfor delay '0:0:5'然后正在运行您的实际Employee查询。

因此,如果您按原样运行查询,请使用其他示例:

 set @v_string='test'''; select * from sys.databases

......将会发生代码行@v_string设置为test',然后立即执行select * from sys.databases。然后剩下的代码将运行,执行您的实际选择。因此,您 select * from sys.databases的结果,然后是Employee查询的结果,但这只是因为您实际上对语句进行了硬编码{{1}进入你的程序而没有意识到:)

如果您希望将字符串select * from sys.databases设置为@v_string,则表示您got the string quoting错误。它应该是:

test'; waitfor delay '0:0:5'