动态WHERE子句& SQL注入

时间:2012-01-03 17:41:13

标签: sql-injection

我需要为用户创建功能以确定选择的WHERE标准 - 标准将是动态的。

有没有办法在不打开SQL注入代码的情况下实现这一目标?

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

2 个答案:

答案 0 :(得分:2)

使用参数化查询将大大有助于保护您免受SQL注入攻击,因为大多数不良事件都发生在where条件的值部分。

例如,给定条件a=="hello" && b=="WORLD",请执行以下操作:

select a,b,c,d
from table
where a=@pa and b=@pb -- this is generated dynamically

然后,绑定@pa="hello"@pb="WORLD",然后运行您的查询。

在C#中,您将从手中的where子句的内存中表示开始,逐个元素地遍历它,并生成两个输出对象:

  • 带有where子句的字符串,其中常量由自动生成的参数引用papb等替换(对这些盲参数使用您喜欢的命名方案:实际名称无所谓)
  • 名称 - 值对的字典,其中名称对应于您在where子句中插入的参数,以及与从表达式表示中提取的常量对应的值。

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

不要这样做

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

答案 1 :(得分:1)

啊两个阶段。鉴于您的列名称和运算符不是直接用户输入。例如。从列表或广播组等中挑选 然后 String WhereClause = String.Format(“{0} {1} @ {0}”,“客户”,“=”);

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

然后您可以添加aparamer客户并从用户输入中进行设置。

有几种方法可以解决这个问题,具体取决于您的标准有多复杂。