網頁

2014年2月18日 星期二

ASP.NET MVC - 移除特定的 Response Headers 內容

在預設的狀態下網頁輸出到 Client 端都會在 Response Header 裡輸出一些資訊,而 ASP.NET MVC 網頁所預設輸出的內容如下:

image

在 Response Header 裡就包含了 Server, X-AspNet-Version, X-AspNetMvc-Version, X-Powered-By 等資訊,在資訊安全的角度來看,這些資訊沒有必要對外透露,透露越多就增加越多的風險,所以這些訊息就有必要在網頁輸出時就要做移除,這篇文章將會說明怎麼做。

 


此篇文章所使用操作示範環境為:Windows 8.1, Visual Studio 2013, ASP.NET MVC 5

 

移除 ASP.NET MVC 版本資訊

首先第一個要做的就是先隱藏網站所使用的 ASP.NET MVC 版本資訊,在 Global.asax 的 Application_Start() 裡加入 MvcHandler.DisableMvcResponseHeader 屬性且設定為 true。

MSDN - MvcHandler.DisableMvcResponseHeader 屬性

如下:

image

這樣原本在 Response Header 裡的 ASP.NET MVC 版本資訊「X-AspNetMvc-Version」就不會輸出,如下:

image

 

移除 ASP.NET 版本資訊

接著要移除的是 X-AspNet-Version 以及 Server 資訊,不過這次並不是在 Global.asax 的 Application_Start() 事件裡去加入程式,而是要在 Application_PreSendRequestHeaders() 事件裡做處理,

MSDN - HttpApplication.PreSendRequestHeaders 事件

處理的方式是先取得目前的 Response,然後移除「X-AspNet-Version」就可以了,如下:

image

網頁的 Response Header 裡就不會出現 X-AspNet-Version 資訊,

image

另外我們也可以在 Application_PreSendRequestHeaders() 事件裡將 ASP.NET MVC Version 資訊做移除,將原本在 Application_Start() 所設定的 MvcHandler.DisableMvcResponseHeader 給註解起來,然後在 Application_PreSendRequestHeaders() 事件裡增加移除「X-AspNetMvc-Version」的處理,如下:

image

網頁的 Response Header 內容,

image

 

要移除 Response Header 裡的 ASP.NET Version 資訊也可以在 Web.Config 裡做設定,先將 Application_PreSendRequestHeaders() 事件給註解起來,並且恢復 Application_Start() 裡的 MvcHandler.DisableMvcResponseHeader 設定,

image

開啟 Web.Config,然後在 system.web 區段的 httpRuntime 裡加入 enableVersionHeader 並且設定為 false,

MSDN - httpRuntime 項目 (ASP.NET 設定結構描述)

image

網頁的 Response Header 內容,

image

這樣也可以達到移除 Response Header 裡的 X-AspNet-Version 資訊。

 

移除 Server 資訊

移除 Response Header 裡的 Server 資訊也是相當重要的,因為沒有必要大剌剌的就讓所有人知道你的網站是用那一個版本的 IIS,而移除的方式就是在 Application_PreSendRequestHeaders() 事件裡去增加移除 Server 資訊的處理,

image

網頁的 Response Header 內容,

image

 

也可以保留 Server 資訊,不過 Server 資訊內容可以改用別的,稍微做一下誤導的處理,不過這只是防君子而已,起不了什麼太大的作用,

image

網頁的 Response Header 內容,

image

 

移除 X-Powered-By 資訊

要移除 X-Powered-By 資訊並非在 Application_PreSendRequestHeaders() 裡面去增加移除的處理,因為這樣做是沒有用處,例如以下就是在程式裡增加移除 X-Powered-By 的內容,

image

加了移除的處理,但是在 Response Header 裡還是一樣出現 X-Powered-By 的資訊,

image

要移除 X-Powered-By 資訊的方式是要在 Web.Config 裡去做處理,要在 system.webServer 區段裡增加以下的內容,

image

網頁的 Response Header 內容,

image

MSDN - remove Element for customHeaders for httpProtocol [IIS Settings Schema]

而另一種常見的作法則是直接到 IIS 裡去設定 Http Response Headers 內容,看是要移除 X-Powered-By 設定還是去改變輸出的內容,

Custom Headers <customHeaders> : The Official Microsoft IIS Site

 

進階處理

有的開發團隊對於 Global.asax 的限制會比較多,甚至是不允許做不必要的修改與任意添加內容,這時候可以使用建立 HttpModule 的方式來處理。

首先就是在網站裡建立一個 HttpModule 的檔案,然後實作 IHttpModule 介面,如下,

image

然後將原本在 Global.asax 所加入的處理內容給搬過來,如下:

image

image

接著就是要在 Web.Config 裡加入使用,在 system.webServer 區段裡的 modules 加入我們所建立的 SampleHttpModule,

image

網頁的 Response Header 內容,

image

 


對於網站的細節資訊最好能夠做到最少的資訊透漏,越不詳細越好,避免將網站暴露在危險之中,雖然上面所作的都只是基本的處理,但還是有很多開發人員會忽略或是不知道要這麼做,所以看完這篇文章之後就趕緊做個處理吧!

 

延伸閱讀與參考連結:

KingKong Bruce記事: 提升ASP.NET MVC專案安全性與效能小技巧

Troy Hunt: Shhh… don’t let your response headers talk too loudly

Removing Unnecessary HTTP Headers in IIS and ASP.NET - 4GuysFromRolla.com

How to remove Server, X-AspNet-Version, X-AspNetMvc-Version and X-Powered-By from the response header in IIS7 - Arturito.net

Howard van Rooijen's EMC Consulting Blog (2004 - 2010) : Cloaking your ASP.NET MVC Web Application on IIS 7

 

以上

4 則留言:

  1. 問題, X-SourceFiles 這個可以移掉嗎?

    回覆刪除
    回覆
    1. 先了解什麼是 X-SourceFiles(應該要先去 Google 一下)
      http://stackoverflow.com/questions/4851684/what-does-the-x-sourcefiles-header-do
      這個只有在 local 端開發環境下才會出現,佈署到正式環境就不會出現。

      刪除
  2. 網誌管理員已經移除這則留言。

    回覆刪除