Http 使用凭据进行跨源资源共享

Http 使用凭据进行跨源资源共享,http,cors,Http,Cors,我有一个跨多个子域(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报头

我有一个跨多个子域(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报头,并允许
访问控制Allow Origin:
以便发出请求,但不幸的是,出现了这种情况

重要注意事项:当响应认证请求时,服务器必须指定域,并且不能使用通配符

有没有办法让我的请求跨多个域工作,并且仍然使用CORS发送凭据?

有两种想法:

1) 是否还包括“访问控制允许凭据:true”标题?这是传递cookie凭据所必需的(并且必须设置相应的XHR客户端。withCredentials=true)

2) 您是否尝试了链接中的建议,并且只包含当前请求的来源。例如,如果一个请求带有标题“Origin:”,您将使用“Access Control Allow Origin:”,而不是一个源列表来响应。这需要在服务器端实现上做更多的工作

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

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


我最终使用了(2)。不知何故,我忽略了单原点方法。如果没有对原点标头进行严格验证,请不要这样做,否则您将打开安全孔。这个答案说明了为什么不可能有傻瓜式的安全性--甚至是technicolor!!>。好的,看来这“本质上”与使用“*”相同,后者可能会打开微妙的安全漏洞,因此不鼓励这样做,看看为什么不这样做:我相信你也可以在域名之间加逗号。(也就是说,是的,你可以让它跨多个域工作。)我不这么认为。从规范来看:>在实践中,原点列表或空生产更受约束。它不是允许以空格分隔的原点列表,而是单个原点或字符串“null”。
// cross domain
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Credentials: true');