我需要为用户创建功能来确定选择的WHERE标准 - 标准将是动态的。动态WHERE子句和SQL注入
有没有一种方法,我可以做到这一点没有我的码对外开放SQL注入?
我正在使用C#/ .NET Windows应用程序。
我需要为用户创建功能来确定选择的WHERE标准 - 标准将是动态的。动态WHERE子句和SQL注入
有没有一种方法,我可以做到这一点没有我的码对外开放SQL注入?
我正在使用C#/ .NET Windows应用程序。
阿两个阶段。鉴于你列名和运营商不是直接的用户输入。例如。从列表或广播组中选取 然后 String WhereClause = String.Format(“Where {0} {1} @ {0}”,“Customer”,“=”);
所以现在你有“Where Customer = @Customer”。
然后你就可以添加aparamer客户和用户的输入设置。
有攻击这几个方面,取决于你的标准有多复杂可能是虽然。
是的,我的列名和操作符是从列表中选取的。现在我的问题是,如果存储过程可以这样做。 – Rivka 2012-01-03 18:07:35
使用参数化查询会走很长的路要走保护您免受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
正确...所以你有什么想法,当字段和操作符是动态的时候,我可以如何使用参数? – Rivka 2012-01-03 17:46:09
澄清 - 我知道如何使用参数。这里的问题是参数,参数值和操作符是动态的。所以我不能像我通常那样简单地添加参数。 – Rivka 2012-01-03 17:50:22
@Becky我刚刚编辑了答案,包含有关如何从查询表达式表示中提取参数的一般信息。 – dasblinkenlight 2012-01-03 17:56:57
你在写什么语言? – Todd 2012-01-03 17:42:24
您使用的是什么技术? .net? PHP的?红宝石? ...其他? – dknaack 2012-01-03 17:43:11
我更新了我的帖子。 – Rivka 2012-01-03 17:45:10