1

假设我正在查询 Sql Server DB 的行计数,该LIKE比较基于对通过 windows 窗体文本输入提供的值的列的比较。由于可能的用户输入导致注入,因此在此处使用参数很重要。最终我要在我命名ExecuteScalar()的实例化对象上执行成员函数,但首先我必须添加参数。例如:SqlCommandcmd

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类型。

4

1 回答 1

1

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

^
-

由于您将参数传递到语句中而不是盲目地附加字符串,因此注入的危险应该很小,但您可能想尝试用户输入的变化,例如:

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

同样,我不确定你是否容易受到攻击,因为我看不到整个事情,但我确实认为构建各种测试非常容易,这样你就可以通过广泛的潜在样本了解所有潜在结果输入。

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

于 2012-08-16T14:59:09.797 回答