作者:大佬銘銘銘銘銘 | 来源:互联网 | 2023-05-23 15:43
如何解决《从其他服务器下载时HTML5下载属性不起作用,即使Access-Control-Allow-Origin设置为all(*)》经验,为你挑选了1个好方法。
我有这样的下载链接:
Foobar
这在同一服务器上下载文件时工作正常,但是当从另一台服务器下载(在这种情况下为Azure blob存储)时,文件名保持为"foo.xls",即使HTTP响应带有以下标头:
Access-Control-Allow-Origin:*
这是设计还是我可以添加到HTTP响应的另一个标题,以使其工作?
1> Alexander O'..:
是的,根据设计,CORS标头对download
属性没有影响.只有两个支持该download
属性的浏览器,Firefox和Chrome,两个浏览器对跨源文件都有不同的策略.
65之前的 Chrome版本确实允许download
跨源文件的属性,没有CORS标头,但Firefox选择不这样做,引用潜在的社交工程攻击.
MDN download
在a
标记的属性部分下记录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。