需要一些关于这个SQL注入问题的帮助:
以下是参数化存储过程的一个版本。排除从应用程序调用它的方式,无论如何都要阻止@v_string被视为动态SQL吗?
我认为这是相当紧张的 - 没有执行或连接的sql,但仍然插入分号允许返回其他数据。
我知道有多个级别可以考虑这个问题,但我想知道是否有一些简单的解决方案我在这里缺少,因为大多数注入修复都涉及动态查询。
re.sub
答案 0 :(得分:2)
无论如何都要阻止@v_string被视为动态的 SQL?
我不希望@v_string
在这里被视为动态SQL,因为T-SQL代码没有EXECUTE
或EXECUTE 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'