asp.net mvc 阻止通過Url直接訪問服務器上的靜態文件


轉載自:http://www.cnblogs.com/xclw/p/6676886.html

 

某些情況下我們需要在服務器上保存一些靜態文件,比如用戶上傳到服務器的文件,如果剛好這些文件的保存目錄是應用程序目錄下的一個子目錄的話,別人就可以通過Url直接訪問這個文件。

例如:在應用程序目錄下的UploadFiles子目錄里保存用戶上傳上來的文件abc.txt, 那么別人就可以有通過url http://hostname/UploadFiles/aaa.txt 直接訪問到這個文件

出於安全的考慮,你不想用戶通過Url的方式訪問這些文件,可以通過如下方法

復制代碼
1     public class RouteConfig 2  { 3 public static void RegisterRoutes(RouteCollection routes) 4  { 5 routes.RouteExistingFiles = true; 6  } 7 } 
復制代碼

這段代碼的作用是告訴服務器,對於靜態文件仍然要走路由(默認情況下如果服務器發現請求的文件在硬盤上存在的話,就用繞過路由,直接從硬盤讀取文件並返回)

但僅僅這么還不夠,如果你是在Debug模式下,還需要對IIS Express做一些設置,方法如下:

通過Visual Studio啟動IIS Express(隨便找一個Web項目,在VS中打開,F5運行),在任務欄會看到IIS Express的圖標

在圖標上右鍵=>顯示所有程序

點擊網站名稱這一欄,會出現如圖所示的界面,點擊配置,會在VS中打開這個config文件

Ctrl+F搜索"UrlRoutingModule-4.0", 將preCondition設置為空

保存文件,重新啟動程序

你會發現通過Url不能直接訪問本地的靜態文件了

注意IIS 和 IIS Express的處理方式是有區別的

如果你的程序發布到IIS上,需要在web.config中添加如下代碼,否則靜態文件還是會交由IIS處理,而不會被路由

<configuration> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> ....... </system.webServer> </configuration>

 

 

到這里還沒有完,因為這樣做所有的對靜態文件的訪問都交給路由來處理了,但有些文件我們還希望不走路由的,比如js文件,css文件還有一些圖片文件,

所以我們還需要告訴服務器,這些文件需要繞過路由系統,直接從硬盤上讀取就行了,方法如下:

復制代碼
1     public class RouteConfig 2  { 3 public static void RegisterRoutes(RouteCollection routes) 4  { 5 routes.RouteExistingFiles = true; 6 routes.IgnoreRoute("Content/{*relpath}"); 7 routes.IgnoreRoute("Scripts/{*relpath}"); 8  } 9 }
復制代碼

對於我的站點而言,Content目錄下放了css文件和圖片文件,Scripts目錄下放的是js文件,我通過上面的代碼指定這兩個目錄的文件繞過路由

 

如果你的目的僅僅是不讓用戶通過Url訪問靜態文件,到這一步已經實現目的了,但我們還可以做進一步的工作,那就是把用戶對靜態文件請求路由到一個自定義的Controller上去

具體做法如下:

復制代碼
 1     public class RouteConfig  2  {  3 public static void RegisterRoutes(RouteCollection routes)  4  {  5 routes.RouteExistingFiles = true;  6 routes.IgnoreRoute("Content/{*relpath}");  7 routes.IgnoreRoute("Scripts/{*relpath}");  8 routes.MapRoute(name: "uploadFiles",  9 url: "UploadFiles/{*filename}", 10 defaults: new { controller = "StaticFile", action = "Index" }); 11      } 12   }
復制代碼

我把所有指向UploadFiles目錄下靜態文件的請求都路由到StaticFile/Index

controller和view的代碼如下:

復制代碼
    public class StaticFileController : Controller { // GET: StaticFile public ActionResult Index(string filename) { ViewBag.FileName = filename; return View(); } }
復制代碼
@{
    ViewBag.Title = "Index";
}

<h2>您請求的文件@(ViewBag.FileName)被禁止訪問</h2>

 

這樣當用戶訪問這些靜態文件時,我會給一個友好提示信息

當然你可以自己寫任何處理邏輯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM