我是否容易受到SQL注入攻击?

3

我正在制作一个包含下列存储过程的SSRS报告。我的用户需要一个搜索工具,可以返回所有可能的名称字段结果,如名称为“AD”时,应返回“ADAM”和“MADELYN”。

我担心,由于我在where子句中使用字符串连接,这个存储过程可能会遭受SQL注入攻击:

BEGIN
    @location varchar(20),@name varchar(20) 
    SELECT location, name 
    FROM   table 
    WHERE  (location LIKE @location+'%') AND (name LIKE '%'+@name+'%')
END

这段代码存在漏洞吗? 如果有,我该如何修复它以确保安全?


1
我认为这里没有什么大问题。你的参数只有20个字符,限制了很多问题。你在where子句中使用它的方式进一步限制了问题,并且没有动态SQL与输入相关,所以我认为从这个角度来看,你可以继续进行。 - Jesse
你总是需要在应用程序层对输入数据进行清洗。 - jonasfh
由于您的位置和名称是参数,所以没问题。添加'%'以进行模糊查询也不会有任何影响。这是一个关于模式和实践的旧链接,但它讨论了带有动态SQL的存储过程和存储过程。(您没有使用动态SQL,所以很好)https://msdn.microsoft.com/zh-cn/library/ff648339.aspx?f=255&MSPPError=-2147217396 - Elim Garak
你正在连接字符串,但是在参数的末尾添加了通配符。如果您使用非参数化动态SQL这样做,则可能会出现问题,但是这看起来很好。 - Sean Lange
1
@jonasfh “清理输入”这个建议常常是误导性的,而且往往没有必要。我更倾向于使用“绑定变量/预处理语句”,因为这样做不太可能导致网站禁止使用撇号。 - Allan
2个回答

5
您发布的代码不易受SQL注入攻击。将您在查询中使用的字符串值连接起来是可以的,只有在将字符串连接在一起构建查询时才会存在漏洞。
对于驻留在T-SQL中的代码,这意味着除非您使用EXECsp_executeSQL,否则您不太可能受到攻击。
以下示例与您的代码等效,但容易受到SQL注入攻击
BEGIN --Don't do this!
    @location varchar(20),@name varchar(20) 
    sp_executesql('
    SELECT location, name 
    FROM   table 
    WHERE  (location LIKE ' + @location + '%'') AND (name LIKE ''%' + @name + '%''')
END

2
这段代码至少没有问题。是的,您正在使用字符串连接,但连接发生在编译后的查询运行时。执行计划已经确定,连接结果仅作为值使用;从未用作代码。没有任何额外的 ' 字符或其他任何字符会导致该字符串的恶意元素泄漏并被解释为 SQL 代码。
当发生在编译时间之前时,字符串连接对于具有用户数据的 SQL 字符串是一个问题...无论是在客户端代码级别还是在服务器上的 exec()、sp_executesql() 或类似操作之前,因为连接结果有可能被解释为代码。
当然,这个存储过程中可能还有其他我们没有看到的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接