2010年4月26日 星期一

ASP.NET 4.0 的改變(1):ValidateRequest=False 失敗

[ASP.NET 2.0]

為了防止 XSS 攻擊,asp.net 2.0 加上了 ValidateRequest 的設計。這一道防護架在網頁層級(aspx)。每一個 aspx 可以自行調整,如下例

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApp._Default" ValidateRequest="true|false" %>

ValidateRequest 的預設值是true。
如果每一個網頁都要改成 ValidateRequest=”false”, 如果要一個個網頁進行修改,豈不是逼瘋人?將每個網頁的預設值改成false,就必須到 Web.config 修改了。如下例。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <pages validateRequest="false" />
  </system.web>
</configuration>

在 asp.net 2.0 的設定相當的實用,並且防止了新進開發人員不小心的錯誤。除非特意地打開潘朵拉寶盒,惡意的 XSS 攻擊可以說是小case。

[ASP.NET 4.0]

在 ASP.NET 4.0的年代,Request Validation 由網頁層級更提昇到應用程式層級。驗證的方法是在 BeginRequest之前就檢查 XSS攻擊。因此,除了原本的 aspx,現在更包括了所有的 requests,如 ashx, wcf, web service 等所有的 asp.net request。

雖然提昇的防護罩保護範圍,卻也連帶地原本上述的設定開始變的不太一樣。如果單一網頁(例如留言版)不需要檢查 request ,想要自行防護呢?原本 ASP.NET2.0 的設定方式是不足了,因為尚未到網頁層級就被擋掉了。

此時,目前看到的文件,最方便的作法就是設回到asp.net 2.0 的防護方式了。在httpRuntime 上,設定驗證方式為 2.0 的檢式。範例如下

<?xml version="1.0"?>
<configuration>
  <system.web>
    <httpRuntime requestValidationMode="2.0"/><!-- 回到 2.0 的防護方式-->
    <pages validateRequest="false" />
  </system.web>
</configuration>
這樣的方式,雖然很方便地回到了舊的 asp.net 2.0 年代,但也失去了全面防護的美意。
有沒有辦法兩全齊美呢?方法是自訂 Reqeust Validator。

[自訂 ReqeustValidator]

ASP.NET 4.0 更增加了自訂 ReqeustValidator 的功能。範例可參考 Creating your own custom request validation。好處呢?自己訂驗證方式,可以自行控制驗證行為。壞處當然是多出一些程式需要維護了。

1 則留言:

Share with Facebook