4

我这里的情况有点糟糕。我一直在使用商务服务器,它并没有做很多清理/参数化。

我正在尝试构建我的查询以防止 SQL 注入,但是需要构建搜索对象上的搜索 / 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);

*上面的例子是你如何优化搜索,但是我们已经做了一些测试,这个字符串是NOT 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();
4

1 回答 1

1

It sounds like you'll have to go old school and validate the data yourself before constructing the query. I'm not a .NET guy but in the CGI world I would sanitize the input with something like:

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

That will thwart any SQL injection I can think of and still allow wildcards. Only problem is the regexs are expensive.

于 2010-05-05T18:08:48.180 回答