我已经学会使用ViewModels来保护我的控制器免受过度攻击。但是,举个例子,我看到了很多:
[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
if (ModelState.IsValid)
{
var dbModel = db.Models.Find(viewModel.Id);
// ... bind viewModel properties to dbModel... but don't bind Id
db.Entry(dbModel).State = EntityState.Modified;
db.SaveChanges();
}
}
是的,您没有绑定ID ...但是,您不能将viewModel.Id
改为Find
并更改与预期不同的dbModel
吗?如果是这样,有没有一种简单的方法来阻止这种情况?
答案 0 :(得分:1)
斯科特的帖子here解决了过度发布的问题。引用:
我们如何解决问题?嗯,有几种方法。您可以标记该物业 如[ReadOnly]。更常见的是,你可以使用BindAttribute 方法参数,只需包含(白名单)您想要的属性 允许绑定:
public async Task<IActionResult>> Create([Bind("First,Last")] Person person)
或者,正确答案。 不要让看起来像这样的模型到达用户附近。这个 是ViewModels的情况。制作一个看起来像View的模型。 然后做好工作。您可以通过类似的方式使工作更轻松 AutoMapper。
有些人发现ViewModel对于基本版来说太麻烦了 东西。那是有效的。有些是“所有ViewModels All The 时间,“但我更实际。使用有效的方法,使用合适的方法, 但要知道下面发生了什么,所以你不会得到一些 scriptkiddie overposting到你的应用程序,并在你的应用程序中翻转 模型作为副作用。
答案 1 :(得分:0)
这就是为什么将id作为参数添加到动作(并检查它是否与模型中的id相同)的好习惯。这与防伪标记相结合通常可以保证您的安全。
请同时查看:
- Parameter Binding in ASP.NET Web API
- Preventing mass assignment or over posting in ASP.NET Core