在R& D之后我没有得到解决这个漏洞的方法。请指导我解决这个缺陷
描述
此数据库查询包含SQL注入漏洞。函数调用使用从用户提供的输入派生的变量构造动态SQL查询。攻击者可以利用此漏洞对其执行任意SQL查询
数据库中。
推荐
避免动态构造SQL查询。相反,使用参数化预准备语句来防止数据库将绑定变量的内容解释为查询的一部分。始终验证用户提供的输入
确保它符合预期的格式,尽可能使用集中数据验证程序。
public void EditUser(User f)
{
string connectionString
= ConfigurationSettings.AppSettings["ConnectionString"];
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = conn.CreateCommand();
string adm = (f.IsAdmin?"1":"0");
string phone="",email="";
if(f.PhoneList.Count > 0)
phone = f.PhoneList[0].ToString();
if(f.EmailList.Count > 0)
email = f.EmailList[0].ToString();
for(int i = 1; i < f.PhoneList.Count; i++)
phone = phone + ";" + f.PhoneList[i].ToString();
for(int i = 1; i < f.EmailList.Count; i++)
email = email + ";" + f.EmailList[i].ToString();
cmd.CommandText = "UPDATE Users SET is_admin="+adm+",login='"+f.Login+"',passwd='"+f.Password+
"',firstname='"+f.FirstName+"',lastname='"+f.LastName+"',email='"+email+"',phone='"+phone+"',address='"+f.Address+"' where user_id="+f.UserId;
conn.Open();
int affected = cmd.ExecuteNonQuery();
cmd.ExecuteNonQuery();
}
答案 0 :(得分:4)
您的代码通过将字符串附加在一起来构建SQL命令
cmd.CommandText
= "UPDATE Users SET is_admin="+adm+",login='"+f.Login+"',passwd='"+f.Password+
"',firstname='"+f.FirstName+"',lastname='"+f.LastName+"',email='"+email+"',phone='"+phone+"',address='"+f.Address+"' where user_id="+f.UserId;
假设某人使用User
值调用您的函数,其中lastname
等于
"Presser';DROP TABLE Users --"
您的SQL命令现在将销毁Users表。
请参阅here,其中MSDN描述了如何避免此问题。