如何在模型绑定期间检测ASP.MVC中的叠加攻击?

时间:2017-01-15 19:43:18

标签: asp.net-mvc security model-binding

我想确定用户是否在Asp.NET MVC中尝试overposting attack

如何确定某人是否正在向我的控制器发送特殊值(例如通过Fiddler)?

注意" bind"

下面的属性
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student)
{
    try
    {
        if (ModelState.IsValid)
        {
            db.Students.Add(student);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    catch (DataException /* dex */)
    {
        //Log the error (uncomment dex variable name and add a line here to write a log.
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
    }
    return View(student);
}
     

Bind属性是防止过度发布的一种方法   创建场景。例如,假设Student实体包含a   您不希望设置此网页的秘密财产。

   public class Student
   {
      public int ID { get; set; }
      public string LastName { get; set; }
      public string FirstMidName { get; set; }
      public DateTime EnrollmentDate { get; set; }
      public string Secret { get; set; }

      public virtual ICollection<Enrollment> Enrollments { get; set; }
   }
     

即使你在网页上没有Secret字段,黑客也可以   使用诸如fiddler之类的工具,或者编写一些JavaScript来发布一个秘密   形式价值。没有Bind属性限制字段   model binder在创建Student实例时使用模型绑定器   将获取该Secret表单值并使用它来创建Student   实体实例。然后黑客指定的任何价值   密码表单字段将在您的数据库中更新。下列   图像显示了添加秘密字段的fiddler工具(带有值   &#34; OverPost&#34;)发布的表单值。

2 个答案:

答案 0 :(得分:5)

如果您使用视图模型,那么叠加对您来说不会有任何问题,也不是您应该关注的问题。原因是您将仅包含应该来自视图模型中的用户输入的属性。然后,您将从数据库中获取实际实体并合并它们。这样,实体的所有明智的属性都将保持不变。因此,根据经验:始终在ASP.NET MVC应用程序中使用视图模型 - 应该修改服务器上某些状态的所有POST控制器操作都应该采用视图模型,而不是实体模型。

因此,不是试图确定某人是否试图改写一些他不应该修改的值,你可以通过允许他只修改他应该修改的值来禁止这一点 - 通过在视图中公开它们模型。

答案 1 :(得分:0)

可能为时已晚,但我仍然建议达到预期用途。

您目前拥有控制器的方式,您永远不会受到此类攻击,但您可以尝试使用(Reference

来保存发送给您的原始POST数据
HttpContext.Current.Request.InputStream.Position = 0;
var result = new System.IO.StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();

然后自己解析它只是为了记录目的,并检查它是否收到了比预期更多的参数或格式错误的参数。

我完全理解并同意你的观点,我一直在分析安全漏洞。但对于关闭的向量,它真的值得对性能产生影响吗?根据我的经验,您将无法标记任何IP,因为我们可以使用VPN来解决它,甚至是TOR。