保护动态生成的 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 注入。
例如,我在下面有一些示例代码。
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 注入。