我有敏感文件要下载给用户,每个用户只允许下载一次给定文件。如果下载失败,我想允许重新下载,但不允许。
依靠在服务器上记录/处理文件下载请求是不够的 - 我需要确定地知道文件何时完成并在客户端就位,因为我的许多用户都在工作在频繁连接下降的环境中。
最简单的方法是,如果浏览器从“另存为...”对话框中显示“文件已保存”事件,该对话框可以连接到下载页面上的JavaScript函数(可以回发到服务器)。但是,直觉表明,如果浏览器暴露了这个功能,可能会出现安全漏洞,因为它会在沙箱之外偷偷溜走。我不确定这是否可能。
我found several other questions in this area,但没有具体针对此问题。
有什么想法吗?
编辑:我不应该在原始问题中使用“安全”一词,抱歉引发红色鲱鱼。
编辑2:我的“安全”措辞误导人们进入了非正式的技术安全问题,但你们两人都证实了我的怀疑,“不,没有浏览器支持。”因为他的第一句话得到了我的期待,所以我正在为第一个评论者做出回答。谢谢大家。
答案 0 :(得分:18)
这是一个很好的解决方案:
http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/
它基本上可以通过在下载文件的响应标头中设置cookie来工作,因此javascript会定期检查此cookie的存在...
答案 1 :(得分:9)
JavaScript中没有此类浏览器事件,即使您无法信任用户的浏览器为您提供安全保障。
最好使用GUID为每次下载生成唯一的URL。然后,您可以例如:
让我澄清最后一颗子弹。假设您正在使用Java - 您将在循环中in.read(buffer)
和out.write(buffer)
直到EOF。如果客户端断开连接,您将在IOException
期间收到out.write()
,并且能够从中断的客户端成功下载。在其他平台上,我确信有办法判断连接是否丢失。
编辑:您实际上可以使用one of the questions you linked to中接受的答案中列出的技巧触发浏览器事件。然而,这不是限制下载次数的可靠解决方案。
答案 2 :(得分:1)
为什么文件可以“一次”下载很重要?文件下载后可以复制,因此让同一用户多次下载文件确实存在安全问题吗?
如果没有,你可以这样做:
最终结果是:
如果您真的很担心,请记录每个下载请求并为多次下载的文件运行预定报告。如果看起来有些可疑,你可以检查安全日志,与用户交谈等等。