Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么我们不应该在视图中使用域对象?_.net_Asp.net Mvc 3 - Fatal编程技术网

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

.net 为什么我们不应该在视图中使用域对象?,.net,asp.net-mvc-3,.net,Asp.net Mvc 3,我只是不明白为什么在视图中使用域对象是不好的做法?我被告知它可以留给模型绑定攻击,但我不确定这是什么或者如何做到。我也不太明白将属性复制到viewmodel将如何解决这个问题 提前感谢您的域对象可以包含敏感信息,如已验证,用户角色等,这些信息不允许直接从客户端代码中影响 如果域对象只包含要在屏幕上显示的属性,则首先可能不需要域模型。域对象通常包含定义标志或位的属性,如isAdmin、isDeleted、,已授权或任何其他安全或敏感信息,您可能不希望最终用户弄乱这些信息,即使您仅以只读状态显示这些

我只是不明白为什么在视图中使用域对象是不好的做法?我被告知它可以留给模型绑定攻击,但我不确定这是什么或者如何做到。我也不太明白将属性复制到viewmodel将如何解决这个问题


提前感谢

您的域对象可以包含敏感信息,如
已验证
用户角色
等,这些信息不允许直接从客户端代码中影响


如果域对象只包含要在屏幕上显示的属性,则首先可能不需要域模型。

域对象通常包含定义标志或位的属性,如
isAdmin、isDeleted、,已授权
或任何其他安全或敏感信息,您可能不希望最终用户弄乱这些信息,即使您仅以只读状态显示这些信息,您在视图/html中泄露了属性名称,这让一些“智能用户”有机会玩您的POST操作,如果你没有采取正确的预防措施,这可能会导致安全漏洞

如果使用ViewModel,则必须从
ViewModel
(域对象)重新映射,在此重新映射中,您可以确保分配正是您希望从任何特定用户处获得的分配,例如:

if(CurrentUser.IsAdmin)
{
   //Assign just if the currrent user is admin
   Model.IsDeleted = ViewModel.Delete;
}

嗯。用户可以修改域对象中的任何字段。这就是ASP MVC中模型绑定的工作方式。他们所需要做的就是在发布表单之前修改表单。例如,您可以使用Chrome/Firefox开发工具


我在博客上写过:

在视图中使用域模型并不总是坏事。 模型绑定攻击正在为不打算编辑的属性提供值。
为防止模型绑定攻击,请使用标记您的操作参数,并使用允许绑定的属性列表指定排除或包含(更好)。

除了其他好处(例如,将视图相关逻辑与域逻辑分离)之外,使用viewmodels将防止BindAttribute为+1。将它与将敏感字段设置为良好默认值的构造函数相结合,您就安全了。