ASP.NET MVC 阻止通过URL访问服务器上的静态资源文件
背景?
在默認情況下,MVC框架是支持對服務器靜態資源的訪問的,我們在項目根目錄下新建一個Content文件夾,然后添加一個命名為“StaticContent.html”的html文件,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?StaticContent.html中的代碼如下圖所示:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title><meta charset="utf-8" /> </head> <body>This is the static html file(~/Content/StaticContent.html) </body> </html>運行項目,輸入URL,可以看到能訪問到這個文件:?
? ? ? ? ? ? ? ? ? ? ? ? ??
?
為磁盤文件定義路由?
為了安全考慮,希望用戶不能訪問某些文件夾,我們可以增加如下代碼:
public static void RegisterRoutes(RouteCollection routes){routes.RouteExistingFiles = true;}這段代碼告訴MVC框架,對于靜態文件我們也要走路由機制(默認情況下,MVC框架發現請求的文件存在于服務器上時,會繞過路由機制,直接讀取文件)?
然后新建一條更具體的靜態路由,映射文件路徑請求,如下圖所示:
public static void RegisterRoutes(RouteCollection routes) {routes.RouteExistingFiles = true;routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapMvcAttributeRoutes();//映射到Customer控制器上的List方法routes.MapRoute("DiskFile","Content/StaticContent.html",new { controller = "Customer",action = "List"});routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); }再次運行項目, 還是能訪問到,如下圖所示:
? ? ? ? ? ? ? ? ? ??
配置應用程序服務器?
以上這么做還不夠,需要配置應用程序服務器。首先啟動MVC項目,在右下角找到?IIS Express,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
右鍵點擊,?選擇“顯示所有應用程序”后,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
單擊網站名稱后,在出現的配置一欄中,再次點擊配置,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
在打開的文件中,搜索“UrlRoutingModule-4.0”?關鍵字,如下圖所示:
將preCondition屬性設置為空字符串,如下圖所示:?
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />在VS中重新運行項目,讓修改后的配置生效,并導航到/content/StaticContent.html,可以看到映射已經生效:?
? ? ? ? ? ? ? ? ? ??
當然,可以自己修改Customer控制器下List方法返回的頁面代碼,增加個提示,比如“無法訪問資源文件”什么的。?
注意IIS 和 IIS Express的處理方式是有區別的,如果你的程序發布到IIS上,需要在web.config中添加如下代碼,否則靜態文件還是會交由IIS處理,而不會被路由。如下圖所示:
<configuration><system.webServer><modules runAllManagedModulesForAllRequests="true" />.......</system.webServer> </configuration>?
繞過路由系統?
到這里還沒結束,以上方法禁止了對所有資源文件的訪問。如果現在去請求scripts文件夾下的靜態js文件,能看到如下圖所示:
? ? ? ? ? ?
如果希望排除某些資源文件?,繞過路由系統,可以用以下代碼:
public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.RouteExistingFiles = true;routes.IgnoreRoute("Scripts/{*pathInfo}");}}?在這種情況下,URL模式將匹配任何兩個片段的URL,第一個片段是“Scripts”,第二個片段{*pathInfo}是所有路徑的意思。
IgnoreRoute方法在RouteCollection中創建了一個條目,在RouteCollection中路由處理程序是StopRoutingHandler類的一個實例,而不是MvcRouteHandler類。路由系統被硬編碼以識別這個處理程序。如果傳遞給IgnoreRoute方法的URL模式匹配,那么后面的路由將不會被計算,就像匹配一個普通的路由一樣。
再次訪問JS文件,成功,如下圖所示:?
?
本文結束 ,部分參考來自這篇文章
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的ASP.NET MVC 阻止通过URL访问服务器上的静态资源文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 引用非 android
- 下一篇: 绕过waf mysql爆库_iwebse