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