代码之家  ›  专栏  ›  技术社区  ›  John Henckel

如何使用条件集合构建SELECT*WHERE

  •  0
  • John Henckel  · 技术社区  · 6 年前

    我想使用来自REST api的查询字符串的条件列表来构建一个SELECT语句。我编写了这个函数,但它可能容易受到SQL注入的攻击。有人能告诉我,如果这是脆弱的如何解决它吗?也许我应该使用某种SQLBuilder包?或者有没有一种方法可以只用dotNet。我正在使用dotNet 4.6.1

        string BuildSelect(NameValueCollection query)
        {
            var result = "SELECT * FROM MYTABLE";
            if (query.Count == 0) return result;
            var logic = " WHERE ";
            foreach (string key in query)
                foreach (string v in query.GetValues(key))
                {
                    result += logic + key + " = " + v;
                    logic = " AND ";
                }
            return result;
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Cetin Basoz    6 年前

    是的,它易受SQL注入攻击。您可以构建查询以使用参数(您只是使用=check only)。

    既然你知道表名,那就意味着你也知道列(键)可以是什么。因此,可以循环列,如果集合具有该键,则将其作为参数化语句添加到where,但值部分未作为字符串传递,则将其解析为应为的类型(或者让后端进行转换,如果无法转换,则获取错误)。在伪代码中:

    List<string> clauses = new List<string>();
    var result = "SELECT * FROM MYTABLE";
    foreach( var col in myTable.Columns )
    {
       if (query.ContainsKey(col.Name))
       {
            clauses.Add( $"{col.Name} = @{col.Name}";
            string v = query[col.Name];
            command.Parameters.Add( $"@{col.Name}", col.Type).Value = typeParse(v); 
       }
    }
    if (clauses.Any())
    {
       result += " WHERE " + string.Join( " AND ", clauses );
    }
    return result;
    

    高温高压