从其他服务器下载时HTML5下载属性不起作用,即使Access-Control-Allow-Origin设置为all(*)

JMK*_*JMK 15 html5 attributes http download cross-domain

我有这样的下载链接:

<a href="foo.xls" download="bar.xls">Foobar</a>
Run Code Online (Sandbox Code Playgroud)

这在同一服务器上下载文件时工作正常,但是当从另一台服务器下载(在这种情况下为Azure blob存储)时,文件名保持为"foo.xls",即使HTTP响应带有以下标头:

Access-Control-Allow-Origin:*

这是设计还是我可以添加到HTTP响应的另一个标题,以使其工作?

Ale*_*ara 27

是的,根据设计,CORS标头对download属性没有影响.只有两个支持该download属性的浏览器,Firefox和Chrome,两个浏览器对跨源文件都有不同的策略.

65之前的 Chrome版本确实允许download跨源文件的属性,没有CORS标头,但Firefox选择不这样做,引用潜在的社交工程攻击.

MDN downloada标记属性部分下记录Firefox 20的此行为,此行为自此以后未更改.

在Firefox 20中,此属性仅适用于具有相同来源的资源的链接.


这篇Bugzilla报告讨论了安全问题以及使用CORS的可能性.

当用户单击此类链接时,将提示用户是否要下载.用户似乎很容易错误地认为原始网站上的某些内容正在下载,而不是来自bank.com.


如果您质疑跨源安全性,是否可以使用同源和CORS(Access-Control-Allow-Origin)实现它?这对于Web应用程序来说是非常有用的功能(使用JS创建Blob并让用户使用一些有意义的名称下载它)

谷歌反对使用CORS.


还有这个Bugzilla报告,它总结了他们从其他bug报告中的决定.

此外,跨版本下载在Google Chrome中完美运行.

是的,我们认为他们通过这样做会增加安全漏洞.

Bugzilla问题似乎并未排除download将来使用CORS进行跨源属性支持的可能性,但是现在使用CORS头对该download属性没有任何作用.如果其他浏览器开始支持该属性,则可能会达成共识.

为了完整起见,当然Content-Disposition可以使用标头强制从其他域下载,但这并不提供与download属性相同的功能.它确实有更好的浏览器支持.

  • 在研究与此类似的问题时。只是最新的。从Chrome 65开始,不再支持跨域下载。请参阅https://developers.google.com/web/updates/2018/02/chrome-65-deprecations。 (2认同)