最近在做一個ASP.NET MVC項目的時候發現,有一個Controller的Action死活都沒法接收到從客戶端提交過來的Html表單請求和數據,后來才發現是因為默認情況下ASP.NET MVC在執行Controller的代碼前,會對客戶端提交到服務器的數據做安全性驗證,如果ASP.NET檢測到客戶端提交的數據中有危險數據(危險數據一般是一些關鍵字和關鍵符號),那么就會中斷當前客戶端提交的請求並且引發一個異常,那么客戶端提交的數據自然就不會進入到Controller和Action了。主要原因是在該項目中有頁面使用了富文本編輯器,而用戶在富文本編輯器中輸入的文字實際上是Html,所以當富文本編輯器的數據提交到服務器端后,ASP.NET認為客戶端提交的數據中包含大量Html標簽是危險數據,請求直接就被終止了,然后拋出異常。其實這個問題不光在ASP.NET MVC中存在,在WebForm中也是有數據安全性驗證的,而且MVC和WebForm的數據安全性驗證是可以通過設置來關閉的,詳情請接着往下看。
后來才知道,原來在ASP.NET MVC中有一個叫ValidateInputAttribute的Filter可以關閉數據安全性驗證,將其加到接收數據的Action上后,客戶端富文本編輯器的數據就能成功傳入Action了,如下所示傳入參數false就告訴ASP.NET不要對這個Action做數據安全性驗證。
下面是對MVC系統自帶常用的幾個Filter的介紹,其中就有ValidateInputAttribute
名稱 | 說明 |
OutputCacheAttribute | 類似於 Web Form中在 OutputCache 指令。 OutputCache 屬性允許在 MVC Framework 緩存控制器的輸出。 |
ValidateInputAttribute | 類似於 Web Form中 ValidateRequest 屬性。 MVC 框架默認將為 檢查HTML 或其他危險輸入傳入的 HTTP 請求。 如果檢測到,將引發異常。 使用此屬性可以禁用請求驗證。 |
AuthorizeAttribute | Authorize 屬性,可以對控制器操做的聲明性的授權檢查。 該屬性可以限制特定角色中的用戶的操作。 當您創建只應該給管理員角色中的用戶的操作時,您可以使用此屬性。默認使用的ASP.NET Membership服務,如果不使用ASP.NET 的Membership服務,可以繼承AuthorizeAttribute,重寫實現。 |
ValidateAntiForgeryTokenAttribute | 此屬性是一個解決方案以幫助防止跨站點的請求攻擊 (CSRF)。 它允許驗證的 HTTP POST 為特定於用戶的標記在 Framework。 有關詳細信息 CSRFs,請參閱" 使用 ASP.NET MVC AntiForgeryToken() 幫助器防止跨站點請求偽造 (CSFR)." |