簡體   English   中英

下載文件時的瀏覽器事件保存到磁盤

[英]Browser event when downloaded file is saved to disk

我有敏感文件要下載給用戶,每個用戶只能下載一次給定文件。 如果下載失敗,我想允許重新下載,但不允許。

依靠在服務器上記錄/處理文件下載請求是不夠的 - 我需要確定地知道文件何時完成並在客戶端就位,因為我的許多用戶在頻繁連接丟失的環境中工作。

最直接的方法是,如果瀏覽器從“另存為...”對話框中公開了“文件已保存”事件,該對話框可以連接到下載頁面上的JavaScript函數(可以回發到服務器)。 但是,直覺表明,如果瀏覽器暴露了這個功能,可能會出現安全漏洞,因為它會在沙箱之外偷偷溜走。 我不確定這是否可能。

在這個領域 發現 其他 幾個 問題 ,但沒有具體說明這個問題。

有任何想法嗎?

編輯:我不應該在原始問題中使用“安全”一詞,對不起觸發紅色鯡魚。

編輯2:我的“安全”措辭誤導人們進入了非正式的技術安全問題,但你們兩人都證實了我的懷疑,“不,沒有瀏覽器支持。” 因為他的第一句話得到了我的期待,所以我正在為第一個評論者做出回答。 謝謝大家。

這是一個很好的解決方案:

http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

它基本上通過在下載文件的響應頭中設置一個cookie來工作,所以javascript會定期檢查這個cookie的存在...

JavaScript中沒有這樣的瀏覽器事件,即使您無法信任用戶的瀏覽器為您提供安全性。

您最好使用GUID為每次下載生成唯一的URL。 然后你可以舉例如:

  • 讓URL僅在特定時間段內有效
  • 僅允許從與唯一URL關聯的特定IP地址進行傳輸
  • 讓您的服務器端代碼檢測何時完全傳輸了唯一URL的內容,然后使URL無效。

讓我澄清最后一顆子彈。 假設您正在使用Java - 您將在循環中使用in.read(buffer)out.write(buffer)直到EOF。 如果客戶端斷開連接,您將在out.write()期間收到IOException ,並且能夠從中斷的數據庫中成功下載。 在其他平台上,我確信有辦法判斷連接是否丟失。

編輯:您實際上可以使用您鏈接其中一個問題的接受答案中列出的技巧來觸發瀏覽器事件。 然而,這不是限制下載次數的可靠解決方案。

為什么文件可以“完全一次”下載很重要? 下載文件后可以復制,因此讓同一個用戶多次下載文件確實存在安全問題嗎?

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

  1. 生成唯一的URL以下載給定文件。 (必要時使用GUID來提供障礙)
  2. 將該URL與USER INFO(瀏覽器類型,IP地址等)和A TIME WINDOW相關聯。 僅允許該用戶和窗口期間的下載。
  3. 窗口應該足夠長,以便用戶注意到傳輸失敗並重新嘗試一次或兩次,但不再重復。

最終結果是:

  1. 您可以合理地確定該文件僅由目標收件人下載。
  2. 您可以確定收件人只能在短時間內下載文件。
  3. 同一個用戶可以多次下載該文件,但誰在乎呢? 它與制作第一個文件的本地副本沒什么不同。

如果您真的擔心它,請記錄每個下載請求並為多次下載的文件運行預定報告。 如果看起來有些可疑,您可以檢查安全日志,與用戶交談等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM