2010-02-26 87 views
19

我有敏感的文件要下載給用戶,並且每個用戶被允許下載給定文件一次。如果下載失敗,我想允許重新下載,但不能以其他方式進行。將下載的文件保存到磁盤時的瀏覽器事件

這不足以依靠記錄/處理文件下載請求在服務器 - 我需要確定性知道文件的完整,且在客戶端的地方時,因爲我的很多的用戶在一個環境中工作頻繁的連接下降。

如果瀏覽器暴露了「另存爲...」對話框中的「文件保存」事件,該對話框可能會連接到下載頁面上的JavaScript函數(可能會回傳到服務器)。但是,直覺表明,如果瀏覽器暴露了這種功能,那麼它可能會存在安全漏洞,因爲它在沙盒外部稍微隱藏。我不確定這甚至是可能的。

foundseveralotherquestionsin this area,但這個問題沒有明確。

任何想法?

編輯:我不應該在原始問題中使用「安全」一詞,對於觸發紅鯡魚抱歉。

編輯2:我的「安全」的措辭誤導人進入offtopic技術的安全性問題,但雙方你證實了我的懷疑,「沒有,有一個爲沒有瀏覽器的支持。」自從他的第一句話以來,我正在爲第一位評論者提供答案。謝謝大家。

+0

這將甚至工作?我的意思是用戶可以很容易地阻止發送到服務器的「未完成」請求,因此一個絕對簡單的臨時黑客可以獲得給定文件的多個副本。 – 2017-06-26 22:00:39

回答

9

在JavaScript中沒有這樣的瀏覽器事件,即使您不能相信用戶的瀏覽器爲您提供安全性。

您最好使用GUID爲每次下載生成一個唯一的URL。然後,您可以例如:

  • 讓URL只在特定的時間段
  • 允許轉讓只用唯一的URL
  • 讓你的服務器端代碼檢測時,相關聯的特定IP地址是有效的唯一網址的內容已完全轉移,然後使網址無效。

讓我澄清最後一個項目符號。假設你正在使用Java - 你將在循環中將in.read(buffer)out.write(buffer)直到EOF。如果客戶端斷開連接,您將在out.write()期間收到一個IOException,並且能夠從中斷的服務器中成功下載。在其他平臺上,我確信有方法可以判斷連接是否丟失。

編輯:你實際上可以使用接受的答案one of the questions you linked to中列出的技巧觸發瀏覽器事件。然而,這不會是限制下載次數的可靠解決方案。

+0

當然,訪問控制將由您描述的機制(和其他機制)提供。不過,這是一個單獨的問題。我還完全同意在故意攻擊面前信任客戶端代碼的不可靠性;幸運的是,在我的環境中,我可以接受這個問題。 我的問題是關於保證一次成功的下載(字節在客戶端),而不依賴於服務器做出決定(你的第三顆子彈)。問題在於服務器可以相信它已經傳輸了文件,而沒有所有字節成功地到達客戶端。 – 2010-02-26 18:24:48

+0

我一定會選擇第三個項目符號,服務器當然有可能知道連接是否已經丟失。 – Martin 2010-02-26 19:18:22

+1

如果您可以接受只在未被蓄意攻擊的情況下才起作用的「安全」系統,爲什麼不相信用戶按照他們的要求去做?這沒有任何意義... – 2010-02-26 19:18:26

1

爲什麼重要的是文件可以「下載一次」?一旦文件被下載,它可能會被複制,那麼讓相同的用戶多次下載文件是否真的存在安全問題?

如果沒有,你可以做這樣的事情:

  1. 生成一個唯一的URL下載指定的文件。 (如果需要,使用GUID進行剔除)
  2. 將該URL與USER INFO(瀏覽器類型,IP地址等)以及時間窗口關聯。只允許該用戶和窗口期間的下載。
  3. 該窗口應該足夠長,以便用戶注意到傳輸失敗並重試一次或兩次,但不再重試。

最終的結果是:

  1. 您可以確信該文件只被預期的接收者下載。
  2. 您可以確定收件人只能在短時間內下載文件。
  3. 同一個用戶可以多次下載文件,但誰在乎?這與製作第一個文件的本地副本沒有區別。

如果您真的很擔心,請記錄每個下載請求,並針對不止一次下載的文件運行計劃報告。如發現任何可疑便可以檢查安全日誌,聊到用戶等

+0

這是外部合同要求:給定用戶可以下載文件一次。問題在於確定事件發生的時間。當然,關於文件下載後複製的方便性,你是對的。你不能在這裏嚴格應用邏輯,這不完全是一個技術問題。 :)關於userinfo/timestamp的建議已經是設計的一部分,以及其他一些好東西。 – 2010-02-26 21:24:50

+0

@David:無賴。在沒有任何內置功能的情況下(我認爲不存在),您依靠客戶端告訴您下載何時完成,這本質上是不可靠的;客戶建立阻止確認被髮出的代理並不難。你有沒有想過設置一個數據包嗅探器或網絡監控工具,可以告訴你是否所有文件的數據包都已發出?仍然並不意味着他們已經成功被接受,但是它比「嘿,瀏覽器,當你完成時讓我知道」更可靠。:) – 2010-02-27 02:54:07

+0

如果可能的話,鑑於用戶的低級複雜程度以及時間 - 限制一個更復雜的攻擊者可能會造成的損害,它可能是足夠可靠的以滿足合同要求(即,如果技術上不密閉的話,它在法律上是合法的)。但根據迄今爲止的答覆,我確認我懷疑這是不可能的。感謝您抽出寶貴的時間! – 2010-02-27 16:58:29

相關問題