为什么我们不应该在视图中使用领域对象?

5
我很困惑为什么在视图中使用域对象是不好的实践?我被告知这可能会导致模型绑定攻击,但我不确定这是什么或者如何进行。我也不太明白将属性复制到视图模型中如何解决此问题。 谢谢。

2
使用视图模型除了其他好处(例如将视图相关逻辑与域逻辑分离)外,还可以防止批量赋值 - nemesv
4个回答

5
您的域对象通常包含定义标志的属性,例如isAdmin,isDeleted,isAuthorized或其他安全或敏感信息,即使您仅以只读状态显示它,也会在视图/HTML中公开该属性名称,从而给一些“聪明的用户”玩弄您的POST操作的机会,如果您没有采取正确的预防措施,这可能会导致安全漏洞。
如果您使用ViewModel,则必须进行从ViewModel <-> Model(域对象)的重新映射,在此重新映射中,您可以确保分配仅为特定用户所需的内容,例如:
if(CurrentUser.IsAdmin)
{
   //Assign just if the current user is admin
   Model.IsDeleted = ViewModel.Delete;
}

1

您的域对象可能包含敏感信息,例如IsAuthenticatedUserRoles等,这些信息不应该直接受到客户端代码的影响。

如果您的域对象除了要在屏幕上显示的属性之外没有其他内容,则您可能根本不需要域模型。


1

1

在视图中使用领域模型并不总是不好的。 模型绑定攻击是提供了一些不应该被编辑的属性值。 为了防止模型绑定攻击,需要在操作参数上标记BindAttribute,并指定允许绑定的属性列表中的Exclude或Include(更好)。


+1 for BindAttribute。将其与设置敏感字段为良好默认值的构造函数相结合,您就可以确保安全。 - Anders Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接