为什么需要Access-Control-Expose-Header?


77

我一直在寻找添加此安全性的具体安全原因。当我实现cors时,这是一个WTH时刻,可以看到所有标头都已返回,但我无法通过javascript访问它们。

Answers:


95

CORS的实现方式不会破坏在CORS之前的纯同源产品世界中所做的假设。

在CORS之前的世界中,客户端可以触发跨域请求(例如,通过脚本标签),但无法读取响应头。

为了确保CORS不会违反此假设,CORS规范要求服务器提供明确的权限,让客户端读取这些标头(通过Access-Control-Expose-Headers标头)。这样,未经授权的CORS请求的行为就如同在CORS之前的世界中一样。


我发现此链接是此答案的一个很好的例子: fetch.spec.whatwg.org/#example-cors-with-response-header
yusong

4

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

CORS规范非常重视您必须先进行请求前握手的想法,其中客户端要求一种连接类型,而服务器则响应它会允许这种连接-因此,这可能只是另一方面。

默认情况下,content-length是不允许的标头,所以我遇到了同样的问题(稍后,当我需要访问WebDAV并不得不修改允许的参数时)。CORS确实没有多大意义(对我而言) )放在首位,因此如果其中的许多内容反复无常,这也不会令我感到惊讶。


3
CORS感到反复无常,恰恰是因为规范作者一直在认真思考。CORS必须启用跨域请求,同时仍要保护浏览器的跨域策略。需要平衡这两种(有时是相反的)力量,这使得CORS规范难以理解。
monsur 2014年

推荐的链接是我本月及以后获得的最有用的指导。我知道Access-Control-Allow-Headers,但没有考虑Access-Control-Expose-Headers,也无法理解为什么我的“ Links”标题没有进入我的Backbone集合。惊人。
mcdave

4

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

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

  • 缓存控制
  • 内容语言
  • 内容类型
  • 过期
  • 上一次更改
  • 语用

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

有关更多参考,请深入链接https://www.html5rocks.com/cn/tutorials/cors/

快乐编码!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.