参数化字符串、LIKE运算符和通配符操作符

4

在我的搜索中,我看到了以下形式的SQL查询中使用参数化字符串:

SqlCommand comm = new SqlCommand();
comm.CommandText="SELECT * FROM table WHERE field LIKE '%'+@var+'%'";
comm.Parameters.AddWithValue("var","variabletext");
SqlDataReader reader = comm.ExecuteReader();

然而,在这个论坛中提到,尽管它被用在参数化字符串中,但仍然容易受到SQL注入的攻击。我只能假设,拼接的字符串可以绕过所有参数化安全性,直接将值插入为一个字符串。如果是这种情况,那么在参数化查询中如何使用通配符运算符,同时避免SQL代码注入?

2个回答

3

这个不容易受到SQL注入的攻击。

谁告诉你这是错的。 '%'+@var+'%' 被视为数据而非可执行代码。它被评估为一个字符串,然后作为 LIKE 右侧的模式使用。

只有在您执行此类连接的结果时才会遇到问题。仅在查询本身中执行字符串连接不是问题。


1
@MohammadGoudarzi - 你错了。这里没有SQL注入问题。OP已经在使用参数化查询。他们只是将某些内容连接到参数上。他们并没有通过连接创建可执行字符串。 - Martin Smith
你不知道如何执行问题中提到的代码,因为它没有具体说明。它可以是任何东西,比如sp_executesql、exec或者可能是SqlCommand。所以我认为最好的建议是安全地执行代码。干杯! - Rikki
@KenWhite - 使用变量或参数进行参数化。没有区别,两者都不是问题。但原始问题特别提到了“参数化字符串”。 - Martin Smith
还要检查我在帖子和评论中刚提到的链接。确实有所不同。 - Rikki
是的,@steventnorris。只有当您执行连接以生成然后执行的字符串时才会出现问题。在查询本身中执行LIKE '%'+@var+'%'是可以的。 - Martin Smith
显示剩余5条评论

2
应该使用“SqlParameter”将值发送到执行搜索的存储过程中。 "SqlParameter" 的目的是拒绝在值中包含的所有注入内容。此外,如果您必须执行包含 SQL 代码或连接参数的文本,那么您应设置命令的“CommandType”属性为“Text”,并使用“SqlParameter”将您的值发送到该文本中。
有关此内容,请参阅Microsoft文档:

http://msdn.microsoft.com/en-us/library/ff648339.aspx

另外在stackoverflow上还有一个问题:

SQLParameter如何防止SQL注入?

同时可以看一下这里的具体例子:

.NET中即使使用SQLParameter也存在SQL注入的例子?

更新:

由于您已经更新了问题,并且现在执行方式已经明确指定,所以在您提到的代码中不再存在SQL注入问题。

干杯

我已经尝试了,它被锁定直到您编辑答案。我会做的!保证。;) 干杯 - Rikki
你应该先编辑答案!我无法撤销它,因为它已被锁定。 - Rikki
1
我做到了。:D 总是用C#,干杯 - Rikki

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