System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client
方法一:通過在 Page 指令或 配置節中設定 validateRequest="false" 可以禁用請求驗證
方法二:正確的做法是在你當前頁面添加Page_Error()函數,來捕獲所有頁面處理過程中產生的而沒有處理的異常。然後給使用者一個合法的報錯
資訊。要是當前頁面沒有Page_Error(),這個異常將會送到Global.asax的Application_Error()來處理,你也可以在
那裡寫通用的異常報錯處理函數。如果兩個地方都沒有寫異常處理函數,才會顯示這個預設的報錯頁面呢。
舉例而言,處理這個異常其實只須要很簡短的一小段代碼就夠了。在頁面的Code-behind頁面中加入這麼一段代碼:
以下是引用片段: protected void Page_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); if (ex is HttpRequestValidationException) { Response.Write("請您輸入合法字串。"); Server.ClearError(); // 要是不ClearError()這個異常會繼續傳到Application_Error()。 } } |
這樣這個程式就可以截獲 HttpRequestValidationException 異常,而且可以按照程式員的意願返回一個合理的報錯資訊。
這段代碼很簡單,所以我希望所有不是真的要允許使用者輸入之類字元的朋友,千萬不要隨意的禁止這個安全特性,如果只是須要異常處理,那麼請用類似於上面的代碼來處理即可。
而對於那些通過 明確禁止了這個特徵的程式員,自己一定要明白自己在做什麼,而且一定要自己手動的檢查必須過濾的字串,否則你的網站非常容易引發跨站指令碼攻擊。
關於存在Rich Text Editor的頁面應當如何處理?
要是頁面有富文本編撰器的控制項的,那麼必定會導致有類的HTML標籤提交回來。在這種狀況下,我們不得不將validateRequest="false"。那麼安全性怎麼處理?如何在這種狀況下最大限度的預防跨站指令碼攻擊呢?
根據微軟的建議,我們應該採取安全上稱為“預設禁止,顯式容許”的策略。
首先,我們將輸入字串用 HttpUtility.HtmlEncode()來編碼,將其中的HTML標籤徹底禁止。
然後,我們再對我們所感興趣的、並且是安全性標籤,通過Replace()進行替換。譬如,我們希望有""標籤,那麼我們就將""顯式的替換回""。
範例程式碼如下:
以下是引用片段: void submitBtn_Click(object sender, EventArgs e) ...{ // 將輸入字串編碼,這樣所有的HTML標籤都失效了。 StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text)); // 然後我們選擇性的允許<b> 和 <i> sb.Replace("<b>", "<b>"); sb.Replace("</b>", ""); sb.Replace("<i>", "<i>"); sb.Replace("</i>", ""); Response.Write(sb.ToString()); } |
這樣我們即容許了部分HTML標籤,又禁止了危險的標籤。
依據微軟提供的建議,我們要謹慎容許下列HTML標籤,因為這些HTML標籤都是有可能導致跨站指令碼攻擊的。
| 以下是引用片段:<applet> <body> <embed> <frame> <script> <frameset> <html> <iframe> <img> <style> <layer> <link> <ilayer> <meta> <object> |
可能這裡最讓人不能理解的是<img>。但是,看過下列代碼後,就應當明白其危險性了。
以下是引用片段: <img src="javascript:alert('hello');"> <img src="java script:alert('hello');"> <img src="java script:alert('hello');"> |
通過<img>標籤是有可能導致Javascript執行的,這樣攻擊者就可以做他想偽裝的任何事情。
關於<style>也是一樣:
以下是引用片段: <style TYPE="text/javascript">... alert('hello'); </style> |
From: http://www.cnblogs.com/RIVERSPIRIT/articles/1085814.html