2016-05-23 49 views
1

任何人都可以請確認,路徑遍歷漏洞是可能的在我的下面的代碼片段?如果是,那麼我應該做出什麼改變。我的下面的代碼中是否可能存在路徑遍歷漏洞?

[RedirectingAction] 
public ActionResult Download(string fileName) 
{ 
    byte[] fileBytes = System.IO.File.ReadAllBytes(Server.MapPath("~/ClientDocument/") + fileName); 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
} 
+0

'filename'從哪裏來? –

+0

文件名來自查詢字符串 –

回答

4

是的,它很脆弱。

只是爲了證明這一點,我成立了一個新的MVC項目名爲WebApplication1.sln

以下請求下載解決方案文件:

http://localhost:56548/Home/Download?fileName=../../WebApplication1.sln

你可以寫一個天真的檢查:

private static readonly char[] InvalidFilenameChars = Path.GetInvalidFileNameChars(); 
public ActionResult Download(string fileName) 
{ 
    if (fileName.IndexOfAny(InvalidFilenameChars) >= 0) 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

    var rootPath = Server.MapPath("~/ClientDocument/"); 
    byte[] fileBytes = System.IO.File.ReadAllBytes(Path.Combine(rootPath, fileName)); 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
} 

這將檢查參數fileName是否是有效的文件名。此不包括目錄分隔符字符,因此它們不能將路徑作爲文件名傳遞。

但是,唯一的方法是完全安全,是限制您的應用程序擁有的權限。只授予它對你的虛擬目錄的權限,沒有別的。

+0

非常感謝@Rob ... –

+0

'Path.GetDirectoryName'也可用於驗證目錄是否是預期的目錄。 – SilverlightFox

+0

不是那麼脆弱。這僅適用於該項目使用開發人員憑據在開發服務器上運行。默認情況下,應用程序池帳戶無權訪問站點根目錄 –