例如,我在下面有一些示例代码。
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注入的最佳方法是什么?我可以动态地参数化列名和值吗?
答案 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注入的密钥名称。