MVC安全性:ViewModel与[Bind()]注释。两者都需要,还是一个或另一个?

时间:2015-04-10 22:08:41

标签: c# asp.net-mvc security entity-framework-6

我一直在寻找这个问题的答案,因为我希望我的代码尽可能安全。

在安全方面,ViewModel[Bind()]是否相同?

详细说明

让我们举个例子,你有以下模型:

Model.cs

public class Model
{
    public int Id { get; set; }

    [Required]
    [RegularExpression(Regex, ErrorMessage = RegexError)]
    [StringLength(20, MinimumLength = 2)]
    public string Something { get; set; }

    [Required]
    [RegularExpression(Regex, ErrorMessage = RegexError)]
    [StringLength(40, MinimumLength = 4)]
    public string SomethingElse { get; set; }

    [Required]
    [RegularExpression(Regex, ErrorMessage = RegexError)]
    [StringLength(60, MinimumLength = 8)]
    public string AnotherSomethingElse { get; set; }
}

ModelController.cs

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Something([Bind(Include="Something,SomethingElse")] Model model)
    {
        // Do stuff here
    }

在这种情况下,我使用[Bind()]注释从Something(Model model)正在执行的操作中排除其他数据。我只允许输入我想要的内容。

但如果我使用ViewModel会发生什么?像这样:

ModelViewModel.cs

public class ModelViewModel
{
    // Security annotations intentionally removed to keep question compact.
    public string Something { get; set; }
    public string SomethingElse { get; set; }
}

...我还需要在[Bind()]中使用Something(Model model)吗?这些是彼此独立的,还是在排除不需要的列进行更新时它们是否以相同的方式工作?

我误解了这是如何工作的吗?

1 个答案:

答案 0 :(得分:3)

两者都绝对等同且足够安全。使用ViewModel似乎更自然。没有必要保留允许绑定的长字符串属性列表。视图模型就是为了这个目的。如果您使用视图模型,则不需要任何Bind()属性。视图模型的属性决定了从请求中反序列化的内容。其他一切都被扔掉了。