我需要为用户创建功能以确定选择的WHERE标准 - 标准将是动态的。
有没有办法在不打开SQL注入代码的情况下实现这一目标?
我正在使用C#/ .NET Windows应用程序。
答案 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
子句的字符串,其中常量由自动生成的参数引用pa
,pb
等替换(对这些盲参数使用您喜欢的命名方案:实际名称无所谓)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客户并从用户输入中进行设置。
有几种方法可以解决这个问题,具体取决于您的标准有多复杂。