参数化查询/不使用/使用查询

时间:2010-05-05 15:49:38

标签: c# .net sql-server commerceserver2007

我在这里遇到了一些不好的情况。我无法使用商务服务器,它没有进行大量的清理/参数化。

我正在尝试构建我的查询以防止SQL注入,但是需要构建一些搜索对象上的search / where子句,并且没有参数化接口。

基本上,我无法参数化,但是我希望能够使用相同的引擎来构建我的查询文本(如果可能)。有没有办法做到这一点,除了编写我自己的参数化引擎,它可能仍然不如参数化查询好?

更新:示例

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);

*以上示例是您如何优化搜索,但是我们已经完成了一些测试,此字符串未经过SANITIZED

这就是我的问题所在,因为.Format中的任何输入都可以是用户输入,虽然我可以轻松地从文本框中清理输入,但我会错过边缘情况,它只是事物的本质。我没有在这里使用参数化查询的选项,因为Commerce Server在如何处理可扩展字段集(模式)和放大器方面有一些疯狂的向后逻辑。自由文本搜索词是在某处预编译的。 这意味着我无法直接进入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();

1 个答案:

答案 0 :(得分:1)

在构建查询之前,听起来你必须自己上学并自己验证数据。我不是.NET人,但在CGI世界中,我会用以下内容来清理输入:

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

这会阻止我能想到的任何SQL注入,并且仍然允许使用通配符。唯一的问题是正则表达式是昂贵的。