我这里的情况有点糟糕。我一直在使用商务服务器,它并没有做很多清理/参数化。
我正在尝试构建我的查询以防止 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();