提升ASP.NET MVC專案安全性與效能小技巧

ASP.NET MVC專案最佳化

在討論ASP.NET MVC時,大多是針對MVC模式與MVC應用程式在討論,較少看到有人討論ASP.NET MVC專案本身,其實ASP.NET MVC專案有幾個地方可以微調整,有些可以增加安全性,有些可以增加效能。

取消Header輸出MVC專案版本

預設的ASP.NET MVC專案在一次回應請求的標頭裡包含著些ASP.NET MVC專案的版本,以 http://kkbruce.tw 為例,預設情況下的回應標頭(Response Header)為:

HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Sat, 27 Jul 2013 17:49:36 GMT
Last-Modified: Sat, 27 Jul 2013 16:49:36 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcUHJvamVjdHNca2ticnVjZS50d1xra2JydWNlLnR3XEJvb3RzdHJhcFxHZXR0aW5nU3RhcnRlZA==?=
X-Powered-By: ASP.NET
Date: Sat, 27 Jul 2013 16:49:39 GMT
Content-Length: 7699
  

由回應標頭(Response Header)中可以看出目前此網站的ASP.NET MVC 4的專案,如果某個版本ASP.NET MVC專案某一天爆發漏洞,那麼要找下手的目標是很容易的。

所有一個簡單的需求,不管我們的ASP.NET MVC專案是什麼版本,MVC 2/3/4/5…都不要在回應標頭(Response Header)顯示ASP.NET MVC專案版本,其實也很容易,只需要在 Global.asax 的 Application_Start() 透過以下設置:

   MvcHandler.DisableMvcResponseHeader = True
  

重新執行專案,重新查詢回應標頭(Response Header):

HTTP/1.1 200 OK
Cache-Control: public, max-age=3600
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Sat, 27 Jul 2013 18:03:34 GMT
Last-Modified: Sat, 27 Jul 2013 17:03:34 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcUHJvamVjdHNca2ticnVjZS50d1xra2JydWNlLnR3XEJvb3RzdHJhcFxTY2FmZm9sZGluZw==?=
X-Powered-By: ASP.NET
Date: Sat, 27 Jul 2013 17:03:36 GMT
Content-Length: 9627
  

適用:ASP.NET MVC 2、ASP.NET MVC 3、ASP.NET MVC 4、ASP.NET MVC 5 Preview。

先路由後實體檔案

ASP.NET MVC專案預設是會先處理實體路徑下的實體檔案,例如,在Controller目錄下放置一個Hello.html的檔案,在進行 http://localhost:port/Controllers/Hello.html 實體檔案請求時,如果ASP.NET MVC找得到實體檔案將會直接進行處理,不會進行相關ASP.NET Routing處理流程(即把控制權交還給 IIS)。

ASP.NET MVC處理實體路徑下的實體檔案

如果希望順序是先ASP.NET Routing後IIS來處理,可在 Global.asax 的 Application_Start() 進行以下設置:

   RouteTable.Routes.RouteExistingFiles = True 
  

雖然依ASP.NET MVC預設路由規則的執行結果和上圖相同,但內部的執行順序已經不一樣。之前是未經Routing處理就呈出出來,現在是已經經過ASP.NET Routing比對,因為ASP.NET Routing比對的結果找不到符合的內容,所以把控制權交還給IIS。

適用:ASP.NET MVC 2、ASP.NET MVC 3、ASP.NET MVC 4、ASP.NET MVC 5 Preview。

調整ViewEngine的處理順序

ASP.NET MVC 2預設只有WebFormViewEngine(即副檔名.aspx / .ascx),到了ASP.NET MVC 3提供另一個選擇RazorViewEngine(即副檔名.cshtml / .vbhtml)。不過在ASP.NET MVC 3之後的專案中執行VeiwEngine的順序是先WebFormViewEngine後RazorViewEngine,而且不管新增專案時選擇的語法為何,都是這個順序,這個可以由出錯的View Page畫面中證明:

ViewEngine執行順序

如果各位在ASP.NET MVC 3/4/5(preview)專案選擇在View Page使Razor語法,其實是可以調整一下ASP.NET MVC專案中預設ViewEngine的執行順序:

  ViewEngines.Engines.Clear()
        ViewEngines.Engines.Add(New RazorViewEngine)
        ViewEngines.Engines.Add(New WebFormViewEngine)
  

這對於中、大型網站在View Page的處理效能上會加分不少(前提是使用Razor語法來開發)。

適用:ASP.NET MVC 3、ASP.NET MVC 4、ASP.NET MVC 5 Preview。

刪除WebFormViewEngine

這個刪除不是真的刪除WebFormViewEngine,而是把WebFormViewEngine出ASP.NET MVC專案中,畢竟它也和我們相處了十來年的歲月。這個手段合適非常龜毛喜歡追求效能的人使用。

礙於版權,程式碼請參考ASP.NET MVC 4網站開發美學,Chaper 5 - Page 5-62。XD

適用:ASP.NET MVC 3、ASP.NET MVC 4、ASP.NET MVC 5 Preview。

以上分享一些用於ASP.NET MVC專案微調的小技巧,設置內容都集中於Application_Start()之中,經過此最佳化的ASP.NET MVC專案不論安全性或效能都會些許的提升。

2 則留言:

  1. 偏好更進一步的選擇 View 使用的語言,畢竟 C#/VB.NET 並行較為少見(真正龜毛)

    http://www.dotnet-tricks.com/Tutorial/mvc/NcJP200113-Custom-Razor-View-Engine-for-C

    回覆刪除
    回覆
    1. 好龜毛的文章,
      感謝提供,龜毛的人 XD

      刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。