我很困惑为什么在视图中使用域对象是不好的做法?我被告知可以留下模型绑定攻击,但我不确定这是什么或如何做到这一点。我也不太明白如何将属性复制到viewmodel将解决这个问题。
提前致谢
答案 0 :(得分:4)
您的域对象通常包含定义标记或位的属性,如isAdmin, isDeleted, isAuthorized
或您可能不希望最终用户弄乱的任何其他安全或敏感信息,即使您只是以只读状态显示它在视图/ html中赠送属性名称,让一些“智能用户”有机会玩你的POST动作,如果你没有采取正确的预防措施,这可能会导致严重漏洞。
如果您使用ViewModel,则必须从ViewModel <-> Model
(域对象)重新映射,在此重新映射中,您可以确保分配只是您希望从任何特定用户获得的分配:
if(CurrentUser.IsAdmin)
{
//Assign just if the currrent user is admin
Model.IsDeleted = ViewModel.Delete;
}
答案 1 :(得分:1)
您的域对象可以包含敏感信息,例如IsAuthenticated
,UserRoles
等,不应允许直接影响客户端代码。
如果您的域对象除了要在屏幕上显示的属性之外不包含任何其他内容,那么您可能不需要首先使用域模型。
答案 2 :(得分:1)
好。用户可以修改域对象中的任何字段。这就是ASP MVC中模型绑定的工作原理。他们需要做的就是在发布之前修改表单。例如,您可以使用Chrome / Firefox开发人员工具。
我在博客上写过:http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/
答案 3 :(得分:1)
在视图中使用域模型并不总是坏事。 模型绑定攻击提供的属性值不用于编辑。 要防止模型绑定攻击,请使用BindAttribute标记您的操作参数,并使用允许绑定的属性列表指定Exclude或Include(更好)。