ormlite-servicestack,C#,Sql Server,Sqlcommand,ormlite Servicestack" /> ormlite-servicestack,C#,Sql Server,Sqlcommand,ormlite Servicestack" />

C# 在ORMLite查询中使用任意数量的参数

C# 在ORMLite查询中使用任意数量的参数,c#,sql-server,sqlcommand,ormlite-servicestack,C#,Sql Server,Sqlcommand,ormlite Servicestack,我正在修复一些易受sql注入攻击的错误sql查询。大多数是没有输入的直接查询,但我们的搜索字段使用未参数化的搜索词。下面是一个片段: using (var db = ORMLite.Open()) { StringBuilder sb = new StringBuilder(); sb.Append("select * from column1, column2"); if (terms.Count() > 0) { sb.Append("

我正在修复一些易受sql注入攻击的错误sql查询。大多数是没有输入的直接查询,但我们的搜索字段使用未参数化的搜索词。下面是一个片段:

using (var db = ORMLite.Open())
{
    StringBuilder sb = new StringBuilder();
    sb.Append("select * from column1, column2");

    if (terms.Count() > 0)
    {
        sb.Append("where (column1 like '%@term0%' or " + column2 + " like '%@term0%') ");
        if (terms.Count() > 1)
        {
            for (int i = 1; i < terms.Count(); i++)
            {
                sb.Append("and (column1 like '%@term" + i + "%' or " + column2 + " like '%@term" + i + "%') ");
            }
        }
    }

    List<POCO> testQuery = db.Select<POCO>(sb.ToString());
}
@term组件是我打算使用参数的地方,它们以前的形式是“+term[I]+”,但是任何带有恶意代码的术语都会被插入。当我移动到select语句时,我想添加参数。这通常是这样做的:

List testQuery=db.Selectsb.ToString,new{term0=t,term1=te,term2=ter}


但是我可以有任意数量的术语。count是术语的数量。如何传入具有任意数量术语的匿名对象?还是有更好的方法?

我在Postgresql中寻找几乎相同的东西。基于 答案似乎是您必须执行多个查询

给定部分参数化的行,我可以从表中获取唯一的行ID 查询,然后直接将这些唯一ID粘贴回查询中-因为 行ID将是安全的

下面是一个例子,说明我的意思,但c可能是错的对不起:

string query = "SELECT unique_id FROM table WHERE (column1 LIKE '%@term%' OR column2 LIKE '%@term%')";
string safeIDs;
List uniqueRowIDs = db.Select(query, new {term = term[0]});

for (int i = 1; i < terms.Count(); i++) {
    // Loop to narrow down the rows by adding the additional conditions.
    safeIDs = uniqueRowIDs.Aggregate( (current, next) => current + string.Format(", '{0}'", next) );

    uniqueRowIDs = db.Select(
            query + string.Format(" AND unique_id IN ({0})", safeIDs),
            new {term = term[i]});
}
// And finally make the last query for the chosen rows:
safeIDs = uniqueRowIDs.Aggregate( (current, next) => current + string.Format(", '{0}'", next) );
List testQuery = db.Select(string.Format("SELECT * FROM table WHERE unique_id IN ({0});", safeIDs));
具体来说,您的案例的另一个选择可能是只获取所需的所有值 类似于使用参数化查询的term0,然后在c程序中比较 与用户输入的其余术语相对应的所有结果