即使在ASP.NET MVC中使用ViewModel,覆盖Edit控制器也很简单吗?

时间:2018-01-04 14:04:06

标签: c# asp.net-mvc

我已经学会使用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吗?如果是这样,有没有一种简单的方法来阻止这种情况?

2 个答案:

答案 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