C# 参数化查询/无查询/使用查询

C# 参数化查询/无查询/使用查询,c#,.net,sql-server,commerceserver2007,C#,.net,Sql Server,Commerceserver2007,我这里的情况有点糟糕。我一直在使用commerce server,它没有进行大量的清理/参数化 我试图建立我的查询以防止SQL注入,但是需要建立一些东西,比如搜索对象上的searches/where子句,并且没有参数化接口 基本上,我不能参数化,但是如果可能的话,我希望能够使用相同的引擎来构建查询文本。除了编写自己的参数化引擎(可能仍然不如参数化查询)之外,还有什么方法可以做到这一点 更新:示例 where子句必须构建为sql查询where子句,本质上: CatalogSearch search

我这里的情况有点糟糕。我一直在使用commerce server,它没有进行大量的清理/参数化

我试图建立我的查询以防止SQL注入,但是需要建立一些东西,比如搜索对象上的searches/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);
*上面的示例是如何优化搜索的,但是我们已经做了一些测试,该字符串未经过消毒

这就是我的问题所在,因为.Format中的任何输入都可能是用户输入,虽然我可以轻松地从文本框中清除输入,但我会错过边缘案例,这只是事情的本质。我在这里没有使用参数化查询的选项,因为Commerce Server在处理可扩展字段集(schema)时有一些疯狂的向后逻辑&自由文本搜索词是在某处预编译的。这意味着我不能直接转到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();

听起来,在构造查询之前,您必须先老一套,自己验证数据。我不是一个.NET的人,但在CGI世界中,我会用以下方法清理输入:

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

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

(强调您的场景是一个好主意,以及为什么您不能使用参数;谢谢)您能给我们举一个例子,说明您试图用它实现什么/如何实现吗?