前言,参数化可以防止SQL注入,,
当修改这种参数化漏洞很多时候都会遇到类似这样一段SQL,如下:
---and A.PersonnelNo in (" + perNoStr + ")
perNoStr是一个字符串拼接来的,值可能是
//["1001","1002","1003","1004"]
string perNoStr = "";
foreach (var item in data)
{
perNoStr = perNoStr + item.PersonnelNo + ',';
}
perNoStr = perNoStr.TrimEnd(',');
这种直接拼入到SQL语句的方式可以查出对应结果,但当改成参数化就会查不出数据,这里是由于一个参数不能把IN关键字里面的都给参数化了,而是要一一参数化。
解决方案,动态生成每一个参数:
List<SqlParameter> listParams = new List<SqlParameter>();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < data.Count; i++)
{
listParams.Add(new SqlParameter { ParameterName = "PersonnelNo" + i, Value = data[i].PersonnelNo });
builder.Append($"@PersonnelNo{i},");
}
if (data.Count > 0)
{
builder.Remove(builder.Length - 1, 1);
}
listParams.Add(new SqlParameter { ParameterName = "Period", Value = Period });
SQL那里直拼字符串,注意这里是直拼字符串而不是参数,所以不存在SQL Injection漏洞
A.PersonnelNo in (" + builder.ToString() + @")
参数builder长这样:
随便打开一个参数化的参数看一下:
每一个参数都被参数化了,这样就成功把IN关键字拼接SQL参数的漏洞修复好了
仅供学习参考,如有侵权联系我删除