在MVC3中发布后保护模型的最佳实践

时间:2012-03-07 11:28:48

标签: asp.net-mvc-3 parsing http-post data-protection

在MVC3中发布后保护模型免受不必要的解析/更新的最佳做法是什么

在HttpGet调用的控制器动作 - >产品/编辑:

 public ActionResult Edit()
        {
          Product p = new Product();
          p.Id = 1;
          p.Name = "PC";
          Category cat = new Category();
          cat.Id = 1;
          cat.Name = "Non food";
          p.Category = cat;

          return View(p);
        }

这是编辑视图:

@model MvcApplication3.Models.Product
@using (Html.BeginForm("Edit", "Product", FormMethod.Post))
{
  @Html.HiddenFor(model => model.Id)
  @Html.EditorFor(model => model.Name)
  <input type="submit" value="Submit" name="go" />
}

浏览器获得响应后,用户将以下html段插入页面:

<input type="text" value="5" name="Category.Id" id="Category_Id"/>

他发布了表单,以下控制器操作获取“Product”参数。

    //
    // POST: /Class1/Edit/5

    [HttpPost]
    public ActionResult Edit(Product p)
    {
      //Here: p.Company.Id is 5    !!!
      db.Save(p);
      return null;
    }

问题是不应允许用户发布/更新c.Company.Id。 我不想检查整个参数结构寻找不需要的值。 我正在寻求解决问题的最佳实践。

感谢任何帮助!

贝斯茨,

Boolish

2 个答案:

答案 0 :(得分:1)

您可以将收到的实体类型(即ViewModel)与持久化的实体类型分离到数据库,如Josh Bush的this recent blog post所述。非常值得阅读 - 也是因为它源于GitHub最近遇到的类似问题。

e.g。

public ActionResult Edit(ProductModel p)
{
    // Map ProductModel -> a Product instance
    // Then save
}

答案 1 :(得分:1)

这就是为什么你应该在视图中使用视图模型而不是db实体

http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/