我只是困惑,爲什麼它是不好的做法,在視圖中使用域對象?我被告知它可以離開模擬綁定攻擊,但我不完全確定這是什麼或如何完成。我也不太明白如何將屬性複製到視圖模型將解決此問題。爲什麼我們不應該在視圖中使用域對象?
在此先感謝
我只是困惑,爲什麼它是不好的做法,在視圖中使用域對象?我被告知它可以離開模擬綁定攻擊,但我不完全確定這是什麼或如何完成。我也不太明白如何將屬性複製到視圖模型將解決此問題。爲什麼我們不應該在視圖中使用域對象?
在此先感謝
您的域對象通常包含一些屬性,這些屬性可以定義像isAdmin, isDeleted, isAuthorized
或任何其他安全或敏感信息的標誌或位,即使您只是以只讀狀態顯示它,也可能不希望最終用戶陷入混亂狀態視圖/ html中的屬性名稱,給一些'聰明的用戶'玩你的POST動作的機會,如果你沒有采取正確的預防措施,這可能會導致安全漏洞。
如果你使用一個ViewModel你不得不做從ViewModel <-> Model
(域對象)重新映射,在此重新映射可以確保該任務只是你從任何特定用戶像希望的:
if(CurrentUser.IsAdmin)
{
//Assign just if the currrent user is admin
Model.IsDeleted = ViewModel.Delete;
}
你的域對象可能包含敏感信息,如IsAuthenticated
,UserRoles
等,不應該被允許直接從客戶端代碼的影響。
如果你的域對象不包含任何東西,但性質上顯示的屏幕,那麼你可能並不需要擺在首位的域模型。
嘛。用戶可以修改您的域對象中的任何字段。這就是ASP MVC中模型綁定的工作原理。他們需要做的就是在發佈之前修改表單。例如,您可以使用Chrome/Firefox開發人員工具。
我的博客上講述它:http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/
鑑於使用領域模型並不總是壞事。 模型綁定攻擊提供的屬性值不用於編輯。 爲了防止模型綁定攻擊與BindAttribute標記您的行爲參數,指定與允許綁定的屬性列表包含或排除(更好)。
+1 BindAttribute。將它與一個將敏感字段設置爲良好默認值的構造函數相結合,並且您是安全的。 –
其他益處的旁邊(例如分離從域邏輯視圖相關邏輯)將防止[質量-分配新建分配FY](http://odetocode.com/blogs/scott/archive/2012/03/11/complete使用的ViewModels -guide到質量分配,在-ASP淨mvc.aspx) – nemesv