2011-01-26 92 views
7

我对这种情况有疑问。Like子句和sql注入

我有一个存储过程中这样的查询:

SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

我的问题是,这是容易受到SQL注入?我需要这种改变是这样的:(?)

declare @column1Like nvarchar(200); 

@column1Like = '%' + @column1 + '%' 

SELECT column1, column2 
FROM table1 
WHERE column1 like @column1Like 

问候

回答

6

快速回答是否定的。为了容易受到SQL注入攻击,必须使用动态SQL执行。

将是脆弱的:

EXECUTE ('SELECT column1, column2 FROM table1 WHERE column1 like ' + @column1Like); 

这也意味着有您的两个实例之间没有真正的区别(从安全角度来看,至少)。

1

,因为它已经是在SQL空间的字符串值,是不容易。虽然,它可能会破坏查询。

2
SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

由于这个查询只能用于变量,它没有地方放代码,而不是数据,因此不会受到SQL注射。

我当然假设@column1这里是一个SQL Server变量,您正在使用客户端语言的参数化查询功能来绑定一个值。

+1

是的,我很注意安全问题。但是这个我没有听到:P – 2011-01-26 13:56:30

1

在这两种情况下,您的查询都不容易受到SQL注入的攻击,因为您使用的是参数化查询。

2

就像=或任何其他谓词没有什么不同。

但是,用户可以在模式中注入其他通配符(%,_)如果那很重要。

-1

我认为这是脆弱的,例如: “%”或1 = 1-- 将显示该数据库的所有寄存器,如果你鸵鸟政策格式,它像@column1Like

在这种情况下,我觉得比it's(@column1Like= ''@column1Like is null) 相同的,但你必须考虑另一个例子像

'%' union select SELECT `column11`, `column22` 
FROM table2 where `colum11` -- is the same type than `column1` 
--and `column22` is the same type than `column22`.