为啥需要访问控制公开标头?

Posted

技术标签:

【中文标题】为啥需要访问控制公开标头?【英文标题】:Why is Access-Control-Expose-Headers needed?为什么需要访问控制公开标头? 【发布时间】:2014-10-29 15:39:22 【问题描述】:

我一直在寻找添加它的具体安全原因。当我实现 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】:

这就是为什么需要 Access-Control-Expose-Headers 的原因:

Access-Control-Expose-Headers(可选)- XMLHttpRequest 2 对象有一个 getResponseHeader() 方法,该方法返回特定响应标头的值。在 CORS 请求期间,getResponseHeader() 方法只能访问简单的响应标头。简单的响应头定义如下:

缓存控制 内容-语言 内容类型 过期 最后修改 编译指示

如果您希望客户端能够访问其他标头,则必须使用 Access-Control-Expose-Headers 标头。此标头的值是您要向客户端公开的以逗号分隔的响应标头列表。

更多参考请戳链接https://www.html5rocks.com/en/tutorials/cors/

编码愉快!!

【讨论】:

【参考方案3】:

这是一个很好的问题。浏览http://www.w3.org/TR/cors/#simple-response-header,不清楚您为什么想要或需要这样做。

CORS 规范非常重视这样一种想法,即您必须进行预请求握手,在该握手中客户端要求一种连接类型,而服务器响应它会允许它 - 所以这可能只是另一个方面。

默认情况下,内容长度不是允许的标头,所以我遇到了同样的问题(后来当我需要访问 WebDAV 并不得不修改允许的参数时).. CORS 真的没有多大意义(对我来说)首先,所以如果其中的大片反复无常,我不会感到惊讶。

【讨论】:

CORS 感觉反复无常,正是因为规范作者仔细考虑了它。 CORS 必须启用跨域请求,同时仍保护浏览器的同源策略。正是需要平衡这两种(有时是相反的)力量,这使得 CORS 规范难以理解。 推荐链接是我这个月得到的最有用的指针,甚至更多。我知道 Access-Control-Allow-Headers 但没有考虑 Access-Control-Expose-Headers 并且不明白为什么我的“链接”标题没有进入我的主干集合。令人震惊。

以上是关于为啥需要访问控制公开标头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥标头访问控制允许来源不起作用?

自定义响应头 AngularJS 的访问控制公开头配置

如何从控制器正确访问 HTTP 标头? (.NET 网络应用程序)

如何访问 Spring MVC REST 控制器中的 HTTP 标头信息?

向标头添加授权并访问 [Authorize] 控制器

ionic 2 没有“访问控制允许来源”标头