SQL命令中使用的特殊元素的不正确中和(“ SQL注入”)

-2 .net sql asp.net-mvc sql-injection veracode

研发之后,我没有针对此缺陷的解决方案。请指导我解决此缺陷

说明
此数据库查询包含一个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();
}
Run Code Online (Sandbox Code Playgroud)

Ros*_*ser 5

您的代码通过将字符串附加在一起来构建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;
Run Code Online (Sandbox Code Playgroud)

假设有人用等于的User值调用了您的函数lastname

"Presser';DROP TABLE Users --"
Run Code Online (Sandbox Code Playgroud)

您的SQL命令现在将销毁Users表。

请参阅此处,MSDN描述了如何避免此问题。