我有一个下载链接,如下所示:
<a href="foo.xls" download="bar.xls">Foobar</a>
在同一服务器上下载文件时效果很好,但从另一台服务器(本例中为 Azure blob 存储)下载时,文件名仍为“foo.xls”,即使 HTTP 响应返回以下标头:
访问控制允许来源:*
这是设计使然,还是我可以将另一个标头添加到 HTTP 响应中以使其正常工作?
是的,根据设计,CORS 标头对
download
属性没有影响。只有两种浏览器支持 download
属性,Firefox 和 Chrome,并且这两种浏览器对跨源文件有不同的政策。
65 之前的 Chrome 版本实际上确实允许跨源文件使用 download
属性,但没有 CORS 标头,但 Firefox 选择不这样做,理由是潜在的社交工程攻击。
download
标签
的
a
属性部分记录了 Firefox 20 的此行为,此后该行为一直没有改变。
在 Firefox 20 中,仅当指向具有相同来源的资源的链接时才会使用此属性。
此 Bugzilla 报告讨论了安全问题和使用 CORS 的可能性。
当用户点击此类链接时,将提示用户是否 想要下载。用户似乎很容易犯错误 认为原始网站上的某些内容正在被 下载的,而不是来自bank.com的东西。>> 是否可以用同源和CORS来实现 >> 如果您质疑跨源,请记住(访问-控制-允许-起源) >>安全?这对于 Web 应用程序来说是非常有用的功能(创建 Blob >> 使用JS并让用户下载一些有意义的名称)
Google 反对为此使用 CORS。
这个 Bugzilla 报告,总结了他们从其他错误报告中做出的决定。
此外,跨源下载在 Google Chrome 中运行良好。
是的,我们认为他们这样做会增加安全漏洞。关于 Firefox 的 Bugzilla 讨论似乎并不排除将来使用 CORS 来支持跨源
download
属性的可能性,但现在使用 CORS 标头并不能启用
download
属性。如果其他浏览器开始支持该属性,则可能尚未达成共识。为了完整起见,当然可以使用
Content-Disposition
标头强制从其他域下载,但这并不提供与
download
属性相同的功能。不过它确实有更好的浏览器支持。