2016-04-26 50 views
2

在項目之一中,我看到下面的代碼。從下載限制.xml文件和.cs文件

 string FileName = Request.QueryString["filename"]; 
     System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
     response.ClearContent(); 
     response.Clear(); 
     response.ContentType = "application/octet-stream"; 
     response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); 
     response.TransmitFile(Server.MapPath("~/" + FileName)); 
     response.Flush(); 
     response.End(); 

這是用來從服務器下載文件。現在如果有人手動更改查詢字符串中的文件名(如web.config),那麼它也會下載配置文件。

因此,請分享您的知識,如何根據文件擴展名限制下載。

+1

絕不允許從您的網站的根目錄下載。始終使用專用的「文件」,「內容」,「公共」或「上傳」區域。 –

+0

你是絕對正確的。但在這個階段,我無法改變它,因爲它在解決方案中使用了多少次。 – NJadon

回答

3

這通常在IIS中完成。但是,如果你想給它編程:

所有的
string[] forbiddenExtensions = new string[] {".config", ".abc", ".xml" }; 
FileInfo fi = new FileInfo(FileName); 
if (forbiddenExtensions.Contains(fi.Extension)) 
{ 
    //throw some error or something... 
} 
+0

配置文件或IIS中的某些配置可能嗎?我不想更改代碼。 – NJadon

+0

[this](https://technet.microsoft.com/en-us/library/cc770504%28v=ws.10%29.aspx)可以幫助你... **但是**,你應該明確地移動你的文件到特定的文件夾和/或重構您的代碼。請花點時間修復這些漏洞... – Nino

+0

.config擴展名不存在於MIME類型列表中。 – NJadon

0

首先,你要問自己是否要編寫代碼,讓用戶下載存在於文件系統上的文件。 Web服務器本身完美地處理文件下載並阻止訪問不應共享的文件。

如果您確定要這樣做,例如因爲您希望在每次下載之前運行一些代碼,那麼您應該查看creating a handler。然後,Web服務器仍然會首先確定權限以及什麼,以防止惡意用戶下載敏感文件,並且在允許的情況下,您的代碼將在下載之前運行。

這就是說,你不想提供文件從你的web根目錄下載。相反,請創建一個專用目錄,例如「下載」,然後託管您的文件以供從那裏下載。然後使用filename = Path.GetFileName(filename)防止用戶在該目錄之外導航(使用..和/或\)。