2010-05-05 38 views
4

我有一个有点可怜这里的情况。我坚持使用商业服务器,这并没有做很多的消毒/参数化。参数化查询/没有/使用查询

我试图建立我的查询,以防止SQL注入,但像搜索/哪里需要搜索对象的条款,要建立一些东西,而且也没有参数的接口。

基本上,我不能参数,但是我希望能够使用相同的发动机,如果能够建立我的查询文本。有没有办法做到这一点,除了编写我自己的参数化引擎,这可能还不如参数化查询?

更新:例

where子句已被建成一个SQL查询语句的where子句主要有:

CatalogSearch search = /// Create Search object from commerce server 
search.WhereClause = string.Format("[cy_list_price] > {0} AND [Hide] is not NULL AND [DateOfIntroduction] BETWEEN '{1}' AND '{2}'", 12.99m, DateTime.Now.AddDays(-2), DateTime.Now); 

*上面的例子是你如何细化搜索,不过,我们做了一些测试,此字符串没有被清除

这就是我的问题所在,因为.Format中的任何输入都可以是用户输入,而我可以很容易地从文本框清理输入,所以我会错过边缘情况,这只是事物的本质。我没有选择在这里使用参数化查询,因为商业服务器中有如何处理组可扩展字段(模式)的一些疯狂向后逻辑&自由文本搜索词是预编译的地方。 这意味着我不能直接去SQL表

什么我/爱/看到的是沿着线的东西:

SqlCommand cmd = new SqlCommand("[cy_list_price] > @MinPrice AND [DateOfIntroduction] BETWEEN @StartDate AND @EndDate"); 
cmd.Parameters.AddWithValue("@MinPrice", 12.99m); 
cmd.Parameters.AddWithValue("@StartDate", DateTime.Now.AddDays(-2)); 
cmd.Parameters.AddWithValue("@EndDate", DateTime.Now); 

CatalogSearch search = /// constructor 
search.WhereClause = cmd.ToSqlString(); 
+0

(这是一个好主意,强调你的情况下,为什么你不能使用参数;感谢) – 2010-05-05 15:54:04

+1

你能给我们带来什么/你是如何想用这个来完成的例子吗? – 2010-05-05 15:59:04

回答

1

这听起来像你必须去老同学并在构建查询之前亲自验证数据。我不是一个.NET的家伙,但在CGI世界我会净化输入的东西,如:

$foo =~ s/[^a-zA-Z0-9*%]//g 

这将挫败任何SQL注入我能想到的,仍然允许使用通配符。唯一的问题是正则表达式很昂贵。