繁体   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