我想确定用户是否正在尝试在Asp.NET MVC中进行过度发布攻击。
如何确定某人是否正在向控制器发送特殊值(例如,通过Fiddler)?
请注意下面的“绑定”属性
[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实体包含一个您不想设置此网页的Secret属性。
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 ICollectionEnrollments { get; set; } } 即使网页上没有Secret字段,黑客也可以使用诸如Fiddler之类的工具或编写一些JavaScript来发布Secret表单值。如果没有Bind属性限制模型绑定器在创建Student实例时使用的字段,则模型绑定器将选择该Secret表单值并将其用于创建Student实体实例。然后,黑客为“秘密表格”字段指定的任何值都将在您的数据库中更新。下图显示了提琴手工具,该工具将Secret字段(值为“ OverPost”)添加到发布的表单值中。
Darin Dimitr.. 5
如果您使用视图模型,那么对于您来说,过高张贴将不是问题,也不是您应关注的事情。这样做的原因是,您将仅包括应该来自视图模型中用户输入的属性。然后,您将从数据库中获取实际实体,并将两者合并。这样,实体的所有明智属性将保持不变。因此,作为一条经验法则:始终在ASP.NET MVC应用程序中使用视图模型-应该用于修改服务器上某些状态的所有POST控制器操作都应采用视图模型,而不是实体模型。
因此,与其尝试确定某人是否试图过度使用一些他不应该修改的值,不如通过允许他仅修改他应该修改的值(通过在视图模型中公开它们)来禁止这样做。
如果您使用视图模型,那么对于您来说,过高张贴将不是问题,也不是您应关注的事情。这样做的原因是,您将仅包括应该来自视图模型中用户输入的属性。然后,您将从数据库中获取实际实体,并将两者合并。这样,实体的所有明智属性将保持不变。因此,作为一条经验法则:始终在ASP.NET MVC应用程序中使用视图模型-应该用于修改服务器上某些状态的所有POST控制器操作都应采用视图模型,而不是实体模型。
因此,与其尝试确定某人是否试图过度使用一些他不应该修改的值,不如通过允许他仅修改他应该修改的值(通过在视图模型中公开它们)来禁止这样做。