我有一个带有asp.net gridview的asp.net网页,其中包含以下查询:
SelectCommand="SELECT * from details2 as t2 WHERE (t2.OCC IN ('+ @txtCOUNTRY +') OR t2.DCC IN ('+ @txtCOUNTRY +')) and t2.ac='Y'"
文本框txtCOUNTRY
值可以包含以下值(例如):
' AR'' ES'
然而,参数@txtCOUNTRY
似乎并不正确,因为gridview没有显示任何内容。
如果我将其更改为(例如)它可以工作:
SelectCommand="SELECT * from details2 as t2 WHERE (t2.OCC IN ('AR,'ES') OR t2.DCC IN ('AR','ES')) and t2.ac='Y'"
所以我只能假设@txtCOUNTRY
参数写错了。
有什么想法吗?
答案 0 :(得分:0)
当您通过SQL参数传递值'AR','ES'
时,它们将自动转义,这会使您的查询真正查找值:'AR','ES'
。
请参阅:Parameterize an SQL IN clause
所以在你的情况下(因为你有一个逗号分隔的值列表,每个都在单引号中):
SelectCommand = "SELECT * from details2 as t2 WHERE " &
"(','+@txtCOUNTRY+',' LIKE '%'','+t2.OCC+''',%' OR ','+@txtCOUNTRY+',' LIKE '%'','+t2.DCC+''',%') " &
"and t2.ac='Y'"
如果您没有将值括在单引号中(例如:AR,ES
),那么查询会变得更具可读性,因为您不必转义查询中的单引号:
SelectCommand = "SELECT * from details2 as t2 WHERE " &
"(','+@txtCOUNTRY+',' LIKE '%,'+t2.OCC+',%' OR ','+@txtCOUNTRY+',' LIKE '%,'+t2.DCC+',%') " &
"and t2.ac='Y'"
修改,以便明确说明其工作原理。
例如,提供AR,ES
作为@txtCOUNTRY
参数的值会产生一个条件:
,AR,ES, LIKE *,[t2.OCC],* OR ,AR,ES, LIKE *,[t2.DCC],*
如果t2.OCC
或t2.DCC
为AR
或ES
,则此条件匹配,因为模式将匹配。
这提供了一种将逗号分隔列表作为参数传递的简单方法,因此您的查询无法通过SQL注入进行利用。