閱讀全文下載代碼:http://www.cckan.net/forum.php?mod=viewthread&tid=74
在用戶端的文體框裡輸入“<任何字元>例如<user>”等字元的時候為出現這樣的錯誤
序安全的嘗試,如跨網站的指令碼攻擊。通過在 Page 指令或 配置節中設定 validateRequest=false 可以禁用請求驗證。但是,在這種情況下,強烈建議應用程式顯式檢查所有輸入。
異常詳細資料: System.Web.HttpRequestValidationException: 從用戶端(txtName="<fd>")中檢測到有潛在危險的 Request.Form 值。
這是沒有設定<pages validateRequest ="true">這個屬性這是預設的,當我們改為false的時候這樣的錯誤就不會出現了,但是我們不能只是這樣改,這樣雖說是沒有錯了, 但是你有沒有想過程式也就不安全了啊,
正確的做法是在你當前頁面添加Page_Error()函數,來捕獲所有頁面處理過程中發生的而沒有處理的異常。然後給使用者一個合法的報錯資訊。如果當前頁面沒有Page_Error(),這個異常將會送到Global.asax的Application_Error()來處理,你也可以在那裡寫通用的異常報錯處理函數。如果兩個地方都沒有寫異常處理函數,才會顯示這個預設的報錯頁面呢。
protected void Page_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpRequestValidationException)
{
Response.Write("請不要輸入這樣的字元,呵呵");
Server.ClearError(); // 如果不ClearError()這個異常會繼續傳到Application_Error()。
}
}
這是ASP.Net提供的一個很重要的安全特性。因為很多程式員對安全沒有概念,甚至都不知道XSS這種攻擊的存在,知道主動去防護的就更少了。ASP.Net在這一點上做到預設安全。這樣讓對安全不是很瞭解的程式員依舊可以寫出有一定安全防護能力的網站。
但是,當我Google搜尋 HttpRequestValidationException 或者 "A potentially dangerous Request.Form value was detected from the client"的時候,驚奇的發現大部分人給出的解決方案竟然是在ASP.Net頁面描述中通過設定 validateRequest=false 來禁用這個特性,而不去關心那個程式員的網站是否真的不需要這個特性。看得我這叫一個膽戰心驚。安全意識應該時時刻刻在每一個程式員的心裡,不管你對安全的概念瞭解多少,一個主動的意識在腦子裡,你的網站就會安全很多。
為什麼很多程式員想要禁止 validateRequest 呢?有一部分是真的需要使用者輸入"<>"之類的字元。這就不必說了。還有一部分其實並不是使用者允許輸入那些容易引起XSS的字元,而是討厭這種報錯的形式,畢竟一大段英文加上一個ASP.Net典型異常錯誤資訊,顯得這個網站出錯了,而不是使用者輸入了非法的字元,可是自己又不知道怎麼不讓它報錯,自己來處理報錯。
對於希望很好的處理這個錯誤資訊,而不使用預設ASP.Net異常報錯資訊的程式員們,你們不要禁用validateRequest=false。
例子 http://www.cckan.net/forum.php?mod=viewthread&tid=73