处理LIKE比较的参数值中的特殊字符

时间:2012-08-16 14:09:57

标签: c# .net-4.0 sql-server-2008-r2

假设我根据对通过Windows窗体文本输入提供值的列的LIKE比较来查询Sql Server数据库的行数。由于可能的用户输入导致注射,因此在此使用参数很重要。最后,我在名为ExecuteScalar()的实例化SqlCommand对象上执行成员函数cmd,但首先我要添加参数。例如:

cmd.Parameters.AddWithValue("@param1", textBox1.Text); 

Sql Server使用特殊字符%作为LIKE比较的通配符匹配。我想要做的是允许用户使用*代替通配符。因此,简单的替换:

textBox1.Text.Replace('*','%');

问题是我遇到包含特殊符号%_的值的问题。搜索文字%而不是将其用作通配符的一种方法是将其括在方括号中:[%]

所以,现在我的替换必须成为:

textBox1.Text.Replace("%","[%]").Replace("_","[_]").Replace('*','%');

订单在这里也很重要,因为如果最后Replace被更快地制作,%将被错误地处理。

我不确定我是否覆盖了我的所有基地,我还需要担心其他角色吗?这真的能防止注射吗?还有其他一些首选方式吗?

示例查询可能是这样的:

SELECT COUNT(*) FROM [MyTable] WHERE [Column1] = @param1

MyTable是您的表名,Column1MyTable中的有效列名。我们可以假设Column1是某种nvarchar类型。

1 个答案:

答案 0 :(得分:1)

你不应该真的需要任何其他东西,但我确保从用户输入测试奇怪的东西。您未考虑的某些字符在LIKE中具有特殊含义:

^
-

由于您正在将参数传递给语句而不是盲目附加字符串,因此应该注入的危险性很小,但您可能需要尝试用户输入的变体,例如:

foo'; DELETE dbo.[UnimportantTable];
foo''; DELETE dbo.[UnimportantTable];
foo''''; DELETE dbo.[UnimportantTable];

同样,我不确定你是否容易受到攻击,因为我无法看到整个事情,但我确实认为构建各种测试非常容易,因此你可以广泛地了解所有可能的结果潜在投入的抽样。

正如@Bryan指出的那样,当然一种限制风险的好方法是使用一个只有你希望它们能够读取的对象具有非常明确的只读权限的登录才能连接。然后,即使他们确实在你的脚手架上开了一些洞,进入也不会买太多。