为啥需要访问控制公开标头?
Posted
技术标签:
【中文标题】为啥需要访问控制公开标头?【英文标题】:Why is Access-Control-Expose-Headers needed?为什么需要访问控制公开标头? 【发布时间】:2017-12-09 23:15:00 【问题描述】:我一直在寻找添加它的具体安全原因。当我实现 cors 并且可以看到所有标题被返回但我无法通过 javascript 访问它们时,这是一个 WTH 时刻。
【问题讨论】:
【参考方案1】:CORS 的实施方式不会破坏在 CORS 之前的纯同源世界中所做的假设。
在 CORS 之前的世界中,客户端可以触发跨域请求(例如,通过脚本标签),但它无法读取响应标头。
为了确保 CORS 不会破坏这一假设,CORS 规范要求服务器为客户端提供明确的权限以读取这些标头(通过 Access-Control-Expose-Headers
标头)。这样一来,未经授权的 CORS 请求的行为就与它们在 CORS 之前的世界中的行为一样。
【讨论】:
我发现这个链接是这个答案的一个很好的例子:fetch.spec.whatwg.org/#example-cors-with-response-header 换句话说,Access-Control-Expose-Headers
根本不是为了安全,而是为了兼容性?有没有我们使用Access-Control-Expose-Headers
来缓解的攻击?【参考方案2】:
这是一个很好的问题。浏览http://www.w3.org/TR/cors/#simple-response-header,不清楚您为什么想要或需要这样做。
CORS 规范非常重视这样一种想法,即您必须进行预请求握手,在该握手中客户端要求一种连接类型,而服务器响应它会允许它 - 所以这可能只是另一个方面。
默认情况下,内容长度不是允许的标头,所以我遇到了同样的问题(后来当我需要访问 WebDAV 并不得不修改允许的参数时).. CORS 真的没有多大意义(对我来说)首先,所以如果其中的大片反复无常,我不会感到惊讶。
【讨论】:
CORS 感觉反复无常,正是因为规范作者仔细考虑了它。 CORS 必须启用跨域请求,同时仍保护浏览器的同源策略。正是需要平衡这两种(有时是相反的)力量,这使得 CORS 规范难以理解。 推荐链接是我这个月得到的最有用的指针,甚至更多。我知道 Access-Control-Allow-Headers 但没有考虑 Access-Control-Expose-Headers 并且不明白为什么我的“链接”标题没有进入我的主干集合。令人震惊。【参考方案3】:这就是为什么需要 Access-Control-Expose-Headers 的原因:
Access-Control-Expose-Headers(可选)- XMLHttpRequest 2 对象有一个 getResponseHeader() 方法,该方法返回特定响应标头的值。在 CORS 请求期间,getResponseHeader() 方法只能访问简单的响应标头。简单的响应头定义如下:
缓存控制 内容-语言 内容类型 过期 最后修改 编译指示如果您希望客户端能够访问其他标头,则必须使用 Access-Control-Expose-Headers 标头。此标头的值是您要向客户端公开的以逗号分隔的响应标头列表。
更多参考请戳链接https://www.html5rocks.com/en/tutorials/cors/
编码愉快!!
【讨论】:
以上是关于为啥需要访问控制公开标头?的主要内容,如果未能解决你的问题,请参考以下文章
如何从控制器正确访问 HTTP 标头? (.NET 网络应用程序)