![](/img/trans.png)
[英]How to tell if a file was really downloaded and saved, despite browser prefetch/cache?
[英]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。 然后你可以舉例如:
讓我澄清最后一顆子彈。 假設您正在使用Java - 您將在循環中使用in.read(buffer)
和out.write(buffer)
直到EOF。 如果客戶端斷開連接,您將在out.write()
期間收到IOException
,並且能夠從中斷的數據庫中成功下載。 在其他平台上,我確信有辦法判斷連接是否丟失。
編輯:您實際上可以使用您鏈接的其中一個問題的接受答案中列出的技巧來觸發瀏覽器事件。 然而,這不是限制下載次數的可靠解決方案。
為什么文件可以“完全一次”下載很重要? 下載文件后可以復制,因此讓同一個用戶多次下載文件確實存在安全問題嗎?
如果沒有,你能做這樣的事情:
最終結果是:
如果您真的擔心它,請記錄每個下載請求並為多次下載的文件運行預定報告。 如果看起來有些可疑,您可以檢查安全日志,與用戶交談等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.