保护动态生成的 SQL 查询免受 SQL 注入。 C#

Protect a dynamically generated SQL query from SQL injections. C#

例如,我在下面有一些示例代码。

updateData(Dictionary<string,string> data){
    string strTemp = string.Empty;
    foreach(KeyValuePair<string, string> values in data){
        strTemp = values.Key + "='" values.Value + "',";
    }
   string query = "update tablename set " + strTemp + "modDate = sysdate"
 //execute query against oracle db
}

在不知道字典和数据中的内容,并且对应用程序的其余部分知之甚少的情况下,防止 SQL 注入的最佳方法是什么?我可以动态参数化列名和值吗?

避免 SQL 注入的 "bulletproof" 方法是参数化您的查询:

UpdateData(Dictionary<string,string> data) {
    var assignments = string.Join(
        ", "
    ,   data.Keys.Select(key => $"{0}=:{0}", key)
    );
    string query = $"update tablename set {assignments}, modDate = sysdate"
    //execute query against oracle db
    Command cmd = ...
    foreach (var kvp in data) {
        cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);
    }
    ...
}

首先将由FieldName=:FieldName部分组成的assignments字符串添加到UPDATE语句中。之后,data 字典中的每个项目都使用 SQL 参数集合上的 AddWithValue 方法绑定到其相应的参数。

注意: 以上假定您可以完全控制 data 字典中的键,因为它们必须与 table 中的列名匹配。如果整个字典来自外部输入,则在构建查询之前根据 table 的元数据验证键是很重要的,以防止试图利用键名进行 SQL 注入。