跨域资源共享(CORS)与凭据

36

我在多个子域名下(例如example.com、blog.example.com和app.example.com)拥有一个通用的身份验证表单。登录表单必须将数据提交到example.com,无论它在哪里显示,因此我考虑使用CORS,但是这样做:

header("Access-Control-Allow-Origin: http://example.com http://blog.example.com http://app.example.com")

无法工作

因此,我考虑了下一步,在服务器端手动检查Origin标头,并允许 Access-Control-Allow-Origin: *,以便可以发出请求,但不幸的是,这在 MDN 中出现了。

重要提示:响应带凭据的请求时,服务器必须指定域,而不能使用通配符。

有没有办法在跨域请求中使用CORS发送凭据并使我的请求能够跨多个域名工作?


我相信你也可以在域名之间加逗号。(也就是说,是的,你可以使其跨越多个域。) - BrainSlugs83
2
我不这么认为。根据规范:实际上,origin-list-or-null 生成的内容更受限制。它不是允许由空格分隔的多个源组成的列表,而是单个源或字符串 "null"。来源 - Nemo
2个回答

49

两点建议:

1)你是否也包括“Access-Control-Allow-Credentials: true”头?这是为了传递cookie凭据所需的(相应的XHR客户端必须设置.withCredentials = true)

2)你尝试过你链接中的建议,仅包括当前请求的来源。例如,如果一个请求带有头部“Origin:http://blog.example.com”,则响应应为“Access-Control-Allow-Origin:http://blog.example.com”,而不是一系列来源。这需要在服务器端实现上进行一些额外的工作。

3)另一个想法是,你提到你有一个必须被各个域共享的单个登录表单。好吧,如果它是一个标准的HTML表单,你可以跨域进行常规的表单提交,无需使用CORS。只需将表单的“action”属性设置为要提交到的URL即可。例如:

<form name="login" action="http://login.example.com/doLogin">

我最终使用了(2)。不知何故,我忽略了单一起源方法。 - Nemo

2
// cross domain
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Credentials: true');

10
未经严格验证 Origin 标头,不要这样做,否则会打开安全漏洞。 - Tom
7
这个回答展示了为什么实现绝对安全是不可能的——甚至用了彩色图像来说明!! >.< - BrainSlugs83
看起来这与使用“*”本质上是相同的,但会产生微妙的安全漏洞,因此不建议使用。请参见https://dev59.com/Bmct5IYBdhLWcg3wjuIj - rogerdpack
为什么不试试这个:http://blog.portswigger.net/2016/10/exploiting-cors-misconfigurations-for.html - JSmyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接