2012-01-03 70 views
2

我需要为用户创建功能来确定选择的WHERE标准 - 标准将是动态的。动态WHERE子句和SQL注入

有没有一种方法,我可以做到这一点没有我的码对外开放SQL注入?

我正在使用C#/ .NET Windows应用程序。

+0

你在写什么语言? – Todd 2012-01-03 17:42:24

+0

您使用的是什么技术? .net? PHP的?红宝石? ...其他? – dknaack 2012-01-03 17:43:11

+0

我更新了我的帖子。 – Rivka 2012-01-03 17:45:10

回答

1

阿两个阶段。鉴于你列名和运营商不是直接的用户输入。例如。从列表或广播组中选取 然后 String WhereClause = String.Format(“Where {0} {1} @ {0}”,“Customer”,“=”);

所以现在你有“Where Customer = @Customer”。

然后你就可以添加aparamer客户和用户的输入设置。

有攻击这几个方面,取决于你的标准有多复杂可能是虽然。

+0

是的,我的列名和操作符是从列表中选取的。现在我的问题是,如果存储过程可以这样做。 – Rivka 2012-01-03 18:07:35

2

使用参数化查询会走很长的路要走保护您免受SQL注入攻击,因为最糟糕的事情在你的where条件值部分发生。

对于exampleg给定的条件a=="hello" && b=="WORLD",做到这一点:

select a,b,c,d 
from table 
where [email protected] and [email protected] -- this is generated dynamically 

然后,结合@pa="hello"@pb="WORLD",并运行你的查询。

在C#中,你将与您携手where子句的内存中表示入手,通过它元素的元素,并产生两个输出对象:

  • where子句的字符串,其中常量由自动生成的参数替代pa,pb,等等(对这些盲参使用您最喜欢的命名方案:实际名称无关紧要)
  • 名称 - 值对的字典,其中名称对应于您在where cl中插入的参数ause和与您从表达式中提取的常量相对应的值。

通过这些输出,您可以使用字符串准备动态查询,使用字典添加参数值,然后对RDBMS源执行查询。

千万不要这么做

select a,b,c,d 
from table 
where a='hello' and b='WORLD' -- This dynamic query is ripe for an interjection attack 
+0

正确...所以你有什么想法,当字段和操作符是动态的时候,我可以如何使用参数? – Rivka 2012-01-03 17:46:09

+0

澄清 - 我知道如何使用参数。这里的问题是参数,参数值和操作符是动态的。所以我不能像我通常那样简单地添加参数。 – Rivka 2012-01-03 17:50:22

+0

@Becky我刚刚编辑了答案,包含有关如何从查询表达式表示中提取参数的一般信息。 – dasblinkenlight 2012-01-03 17:56:57