單點登入 CAS 導致 asp.net mvc 的“從客戶端中檢測到有潛在危險的Request.Form值”錯誤
我強調一下:ofollow,noindex" target="_blank">在asp.net mvc中,如果遇到表單提交時,報“從客戶端中檢測到有潛在危險的Request.Form值”這種錯誤,
方法一:
就在action頭部加上[ValidateInput(false)]
特性,這就足夠了,而且絕對可行。不要信網上什麼修改配置檔案,還要將執行時改為2.0,都快5.0了,你還2.0,扯。
但這不是最好的辦法,因為同一表單,往往有多個欄位。我認為比較好的方式是,
方法二:
提交的時候,用實體類引數代替FormCollection引數,實體類裡需要用到html標記的屬性,加上[AllowHtml]
特性。
public class MailVM { public string Title { get; set; } public string Time { get; set; } [AllowHtml] public string Mess { get; set; } }
如果上面2種方法都不行,怎麼辦?
這是不可能的。如果真出現了這種情況,就檢查下你是否用到了一些額外的Handler或module,比如我今天就發現,因為專案使用了CAS作為單點登入,客戶端 DotNetCasClient.dll會率先對所有的請求進行攔截,我們定義在action上的特性之類根本還沒機會執行到就報錯了。
<modules> <remove name="DotNetCasClient"/> <add name="DotNetCasClient" type="DotNetCasClient.CasAuthenticationModule,DotNetCasClient"/> </modules>
這時就要對官網給的DotNetCasClient稍作修改。沒關係,官網有原始碼,直接下載下來修改。
原始碼為
internal static bool GetRequestIsCasSingleSignOut() { CasAuthentication.Initialize(); HttpContext context = HttpContext.Current; HttpRequest request = context.Request; bool requestIsFormPost = (request.RequestType == "POST"); //請注意這一行 bool haveLogoutRequest = !string.IsNullOrEmpty(request.Params["logoutRequest"]); bool result = ( requestIsFormPost && haveLogoutRequest ); return result; }
CAS客戶端並沒有刻意去攔截什麼危險性內容,但request.Params["logoutRequest"]
這個讀取動作會自然觸發異常。知道原因就好改了。
可以改為
internal static bool GetRequestIsCasSingleSignOut() { CasAuthentication.Initialize(); HttpContext context = HttpContext.Current; HttpRequest request = context.Request; bool requestIsFormPost = (request.RequestType == "POST"); //by chenqu bool haveLogoutRequest = false; if(requestIsFormPost) { try { haveLogoutRequest = !string.IsNullOrEmpty(request.Params["logoutRequest"]); } catch(System.Web.HttpRequestValidationException ex) { haveLogoutRequest = false; } catch(Exception ex) { throw ex; } } bool result = ( requestIsFormPost && haveLogoutRequest ); return result; }
改完,編譯成新的DotNetCasClient.dll,替換專案中的就OK了。尼瑪再也不用擔心你提交了啥危險內容了。其實,所謂XSS跨域攻擊,提交的內容到了伺服器,這時還不會有啥問題的,只有你將提交的內容又展示在頁面上才會發生攻擊,因為只不過是些HTML標記罷了,只有在瀏覽器才能被解釋執行。