2010年12月1日 星期三

ASP.NET 4.0 設定 了 validateRequest="false" 仍然會出現 具有潛在危險 Request.QueryString 的錯誤訊息

微軟的asp.net網頁都會預設進行Request Validation,但若是想規避這樣的內建行為。(建議仍要有其他的方法來防範XSS攻擊)

通常我們可以在.aspx中的Page Tag設定:
<@Page Language="C#" validateRequest="False" >

或是直接對整個站台設定Web.Config中 <system.web>下設定全域的
<pages validateRequest="false" />

不過,假如你現在在ASP.NET 4.0 的環境下的話,就算進行上述的設定,可能仍會出現驗證失敗的訊息(潛在危險Request.QueryString的錯誤訊息)

因為ASP.NET4.0與2.0版本在請求驗證的定義上已經有所不同:
ASP.NET Request Validation請求驗證是ASP.NET提供來保護XSS攻擊的一項功能
在先前的ASP.NET(ASP.NET 2.0)網頁,都是預設會進行網頁請求的請求驗證
僅會針對.aspx以及他們的class檔案進行驗證
不過到了ASP.NET 4.0,請求驗證範圍擴大到所有的請求
因為從BeginRequest階段就開始了HttpRequest
因此在這個期間任何的資源要求都會進行請求驗證
而非網頁檔案(.aspx)而已,還包含WebService呼叫以及自訂的http Handlers,都會去驗證http請求的內容
因此在ASP.NET 4.0下,可能在非網頁請求的情況下,仍會發生請求驗證錯誤的訊息
這時為了避免這樣的問題,一樣在Web.Config中 <system.web>下加入下列語句
<httpRuntime requestValidationMode="2.0" />

這樣就可以讓請求驗證只焦點在.aspx網頁上了。

沒有留言:

張貼留言