响应中“ Access-Control-Allow-Origin”标头的原因一定不能是通配符“ *”错误

时间:2018-08-09 09:27:52

标签: cors

我有一台服务器,它公开了一些资源,并发送回以下标头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

之所以需要这样做,是因为服务器包含静态资源,这些资源可以通过我们Intranet上的各种Web应用程序和开发环境进行访问,而这些资源都是不同的来源。

直到最近,它一直可以正常工作,但是现在停止了。现在,如果我们尝试从任何来源访问任何资源,则会收到错误消息:

Failed to load http://foo/bar/res: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://devenv06:4589' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute

因此,我尝试手动添加我的起源,如下所示:

Access-Control-Allow-Origin: http://devenv01,http://devenv02,http://prodserver
Access-Control-Allow-Credentials: true

但是现在我收到错误:

Failed to load http://foo/bar/res: The 'Access-Control-Allow-Origin' header contains multiple values, but only one is allowed

这基本上使服务器无法使用,因为我需要多个来源。

所以,我想知道的是:

  • 这是浏览器引入的新东西,还是服务器上发生了变化?为什么以前在该配置下不能正常工作,而现在却不能呢? (客户端代码未更改...)
  • 是否有一个通用的解决方案,而不必手动设置每个可能的来源?

1 个答案:

答案 0 :(得分:1)

  

这是浏览器引入的新东西,还是服务器上发生了变化?

这不是规范中的新要求。

  

是否有一个通用的解决方案,而不必手动设置每个可能的来源?

编写逻辑,该逻辑读取Origin request 标头,然后使用该值生成Access-Control-Allow-Origin response 标头。

通常,您通常需要先将其传递给白名单,否则,您将授予evil-hacker.example.com的权限,以便使用登录到您网站的用户的浏览器向服务器发出请求,并提供所有必要的凭据来证明他们就是他们所说的。那可能是一个巨大的安全性问题,并且一开始就没有凭据。