BloggerAds

2011年6月20日 星期一

ASP.NET錯誤:具有潛在危險 Request.Form 的值已從用戶端 偵測到 對應方式

在ASP.NET中,預設會將XSS (Cross Site Script)攻擊擋掉,若發現XSS攻擊,ASP.NET就會出現下列這種錯誤訊息:
具有潛在危險 Request.Form 的值已從用戶端 (XXXX) 偵測到
對於網頁開發者來說,自動擋掉錯誤是一件好事,但系統卻會出現錯給你的User看,這是個很不好的,為了避免這種狀況,
有一種解決方式是將 validateRequest 設成false,如果是針對個別網頁的話,修改的地方如下:
<%@ Page Language="C#" AutoEventWireup="false" CodeFile="Test.aspx.cs" Inherits="Test" validateRequest="False" %>
如果要針對整個網站的話,則是透過修改 web.config來達到整個網站關閉的目的
<system.web>
         <pages validateRequest="False" />
</system.web>

但若依上述方式修改,等於是讓系統開了個漏洞,所以若以上述方式修改的話,還必須要為每個控制項的值加入HtmlEncode,以防止XSS攻擊,ex.
txtBox1.Text = HttpUtility.HtmlEncode(txtBox1.Text)
總而言之,上面的方式,我個人覺得不太好,所以接下來還有另一種方式:透過Error事件,來做處理。這也有兩種方式可以實作
第一種方式,是用Page_Error來做處理,在程式中加入如下程式:
    protected void Page_Error(object sender, EventArgs e) {              
        if (Server.GetLastError().GetType().ToString() == "System.Web.HttpRequestValidationException") {
            Response.Redirect([要導入的錯誤畫面]);
        }

        Server.ClearError(); //清掉錯誤,讓ASP.NET的錯誤不出現
    }
若嫌要在每個網頁加上這段程式很麻煩,可以建立一個 BasePage 類別,再讓每個網頁繼承即可。

另外還有一種更方便的方式:在 Global.asax新增application_error事件,程式如下:
 void Application_Error(Object sender, EventArgs e)
    {
       if (Server.GetLastError().GetType().ToString() == "System.Web.HttpRequestValidationException") {
            Response.Redirect([要導入的錯誤畫面]);
        }
     
        Server.ClearError();
    }
這樣就不會出現ASP.NET錯誤了

參考資料:
http://tgw1029.blogspot.com/2010/02/requestform.html
http://social.msdn.microsoft.com/forums/zh-TW/236/thread/a4ecbacc-ffb9-49b9-bf52-93749a3e699a
http://www.dotblogs.com.tw/kirkchen/archive/2009/12/07/12314.aspx

沒有留言:

張貼留言