代码之家  ›  专栏  ›  技术社区  ›  Jason Anderson

将安全SQL语句创建为字符串

  •  11
  • Jason Anderson  · 技术社区  · 17 年前

    我正在使用C#和.NET3.5。我需要生成并存储一些T-SQLINSERT语句,这些语句稍后将在远程服务器上执行。

    new Employee[]
    {
       new Employee { ID = 5, Name = "Frank Grimes" },
       new Employee { ID = 6, Name = "Tim O'Reilly" }
    }
    

    我需要得到一个字符串数组,如下所示:

    "INSERT INTO Employees (id, name) VALUES (5, 'Frank Grimes')",
    "INSERT INTO Employees (id, name) VALUES (6, 'Tim O''Reilly')"
    

    我正在看一些用String.Format创建insert语句的代码,但感觉不太对劲。我考虑过使用SqlCommand(希望这样做) something like this ),但它不提供将命令文本与参数组合的方法。

    string.Format("INSERT INTO Employees (id, name) VALUES ({0}, '{1}')",
        employee.ID,
        replaceQuotes(employee.Name)
        );
    

    这样做时,我应该关心什么?源数据相当安全,但我不想做太多假设。

    编辑:只是想指出,在这种情况下,我没有SqlConnection或任何直接连接到SQLServer的方法。这个特定的应用程序需要生成sql语句并将它们排队,以便在其他地方执行——否则我将使用SqlCommand.Parameters.AddWithValue()

    5 回复  |  直到 9 年前
        1
  •  17
  •   Mitch Wheat    17 年前

    创建SqlCommand对象,如下所示:

    SqlCommand cmd = new SqlCommand(
            "INSERT INTO Employees (id, name) VALUES (@id, @name)", conn);
    
    SqlParameter param  = new SqlParameter();
    param.ParameterName = "@id";
    param.Value         = employee.ID;
    
    cmd.Parameters.Add(param);
    
    param  = new SqlParameter();
    param.ParameterName = "@name";
    param.Value         = employee.Name;
    
    cmd.Parameters.Add(param);
    
    cmd.ExecuteNonQuery();
    
        2
  •  8
  •   Jon Skeet    17 年前

    使用参数化命令。将参数也传递给远程服务器,并将其调用到SQL server中,同时保持SQL本身和参数值之间的区别。

    只要你从不把数据当作代码来处理,你就应该没事。

        3
  •  4
  •   KMX    14 年前

    通过以下方式修复替换引号功能:

    void string replaceQuotes(string value) {
         string tmp = value;
         tmp = tmp.Replace("'", "''");
         return tmp;
    }
    

    干杯

        4
  •  1
  •   JoshBerke    17 年前

    嗯,我同意其他所有人的看法,你应该使用参数化查询,我就不说了。但是如何将这些sql语句传递到远程服务器?您是否有某种类型的服务,如web服务,可以接受并执行任意Sql命令,或者您的客户端应用程序是否会直接访问数据库?

    如果你通过某种代理,那么无论你在客户端上对数据进行了多少清理,黑客都可以绕过你的应用程序,攻击服务。在这种情况下,按照Cade的建议,以XML或您选择的任何格式(JSON、Binary等)传递数据,然后在实际运行命令之前构建SQL。

        5
  •  0
  •   Cade Roux    17 年前

    推荐文章