如何在模型绑定期间检测 ASP.MVC 中的过度发布攻击?

问题描述 投票:0回答:4

我想确定用户是否正在尝试在 Asp.NET MVC 中进行“过度发布攻击”。 我如何确定是否有人正在向我的控制器发送特殊值(例如通过 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 实体包括
  您不希望此网页设置的秘密属性。

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 来发布 Secret
  形式值。没有 Bind 属性限制的字段
  模型绑定器在创建 Student 实例时使用模型绑定器
  将获取该 Secret 表单值并使用它来创建 Student
  实体实例。然后无论黑客指定什么值
  秘密表单字段将在您的数据库中更新。下列
  图像显示 fiddler 工具添加 Secret 字段(其值
  “OverPost”)到已发布的表单值。

asp.net-mvc security model-binding
4个回答
8
投票

因此,您不必尝试确定某人是否试图过度发布一些他不应该修改的值,而是可以通过允许他仅修改他应该修改的值(通过在视图模型中公开它们)来简单地禁止这种情况。

可能为时已晚,但我仍然有一个达到预期目的的建议。


1
投票
参考

获取发送给您的原始POST数据

HttpContext.Current.Request.InputStream.Position = 0; var result = new System.IO.StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd(); 然后自己解析它,仅用于记录目的,并检查它是否收到比预期更多的参数或格式错误的参数。

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

就我个人而言,我不会费心记录所有传入的内容,您只会用垃圾填充日志(尽管如果日志记录配置为仅记录错误,则无关紧要)。你能得到的唯一好处就是有人尝试过,但失败了,仅此而已。你不能做太多事。您可以阻止 IP 地址,但国内 ISP 总是分配不同的 IP,因此下次 IP 分配给其他人时,您最终可能会阻止合法用户。


0
投票

(1) 您问题中的 Student 类有一个 Id 和一个 Secret 属性。与其他答案一样,通过使用 DTO 或视图模型来解决问题,其 Post 方法要么不接受 Id 或 Secret 作为属性,要么实际上不执行它们的集合。 (2) 也许你的秘密财产应该是私有的而不是公共的。参见“范围”。 (3) 向我过度发布意味着与您的链接问题完全不同的内容,但在 CRUD 应用程序中是真实的。这两种情况是:a)新客户在网页上输入了数据并按下“保存”按钮,但网页响应时间太长,因此用户再次按下按钮以尝试确保数据已提交或b )在多用户环境中,两名职员正在输入数据并获取相同的新客户的纸质表格进行提交,最终将数据发布两次。 这两种情况的真正后端修复是幂等的(即,不是插入两次并创建重复项,而是检查是否存在,如果存在则更新,否则插入)。 (PS - 您还可以通过防止按下额外的按钮来修复 UI)。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.