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