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

时间:2018-04-20 20:07:09

标签: c# sql .net oracle sql-injection

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

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注入的最佳方法是什么?我可以动态地参数化列名和值吗?

1 个答案:

答案 0 :(得分:1)

&#34;防弹&#34;避免SQL注入的方法是参数化你的查询:

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);
    }
    ...
}

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

注意:以上假设您可以完全控制data字典中的键,因为它们必须与表中的列名匹配。如果整个字典来自外部输入,则必须在构造查询之前根据表的元数据验证密钥,以防止尝试利用SQL注入的密钥名称。