我想确定用户是否在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;)发布的表单值。
答案 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。