2016-09-16 43 views
0

我目前在「下載文件」實施使用Web API的工作2.允許URI的Web API調用

然而,作爲可下載不存儲在數據庫中的文件的完整的文件路徑,我我傳入完整的文件路徑作爲標識參數。

看來這種方法的問題在於filePath包含對URI無效的字符......有沒有人有任何建議來解決這個問題或替代方法?

下載文件的方法:

[HttpGet] 
    [Route("Files/{*filePath}")] 
    public HttpResponseMessage Get([FromUri]string filePath) 
    { 
     try 
     { 
      var file = new FileInfo(filePath); 

      byte[] bytes = System.IO.File.ReadAllBytes(filePath); 

      var result = Request.CreateResponse(HttpStatusCode.OK); 

      result.Content = new ByteArrayContent(bytes); 
      result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      result.Content.Headers.ContentDisposition.FileName = file.Name + file.Extension; 

      return result; 

     } 
     catch(Exception ex) 
     { 
      return Request.CreateResponse(HttpStatusCode.InternalServerError, ex); 
     } 
    } 

回答

0

要求客戶把完整路徑的URI(即使它被編碼,以便它包含唯一有效字符的URI)意味着你可能會地方出版這些路徑...這不是幾個原因一個偉大的想法:

  1. 安全 - full Path Disclosure和相關Relative Path Traversal
    1. 什麼是阻止某人通過敏感文件的路徑(例如你的web.config文件),並可能獲取有助於攻擊你的系統的信息?
  2. 可維護性
    1. 客戶端可以保持重用或分發URI的副本 - 如果文件路徑改變會發生什麼?有關這個主題的一些相關的談話在這裏:Cool URIs don't change

我的建議 - 你不必把自己的文件在數據庫中,而是把文件的列表在數據庫中,並使用一個唯一的標識符在URL中(例如,可能是slugGUID)。在數據庫中查找標識符以發現路徑,然後返回該文件。

這保證:

  1. 沒有人可以讀取一個文件,你還沒有建立索引,確定是安全的下載
  2. 如果你將可以更新文件的數據庫和客戶端的URI不會改變
  3. ,併爲你原來的問題作出迴應,你可以很容易地確保唯一標識符僅由URI的安全角色

一旦你的數據庫,隨着時間的推移你也可能對維護數據庫中的其他元數據非常有用,例如誰上傳文件,何時下載,何時下載,以及何時等。

+0

感謝您的詳細回覆,Chris!你在那裏展示的一些很好/有用的觀點。您的建議的一個問題是保持數據庫最新...如果新文件被添加到源文件夾,移動或刪除,數據庫將不得不手動更新... – Tomuke

+0

根據API的性質和數量客戶可能是一件好事 - 例如如果您有50個API客戶端並且您移動了一個文件,您是否願意更新50個客戶端或一個數據庫條目?如果你可以用更多關於客戶端 - 服務器關係的信息來更新你的問題(有多少客戶端,他們如何獲得放入api URI的路徑知識等),這將有助於提供更好的答案。 –