Php allowcredentials为true的通配符CORS

Php allowcredentials为true的通配符CORS,php,ajax,angularjs,laravel,cors,Php,Ajax,Angularjs,Laravel,Cors,我有一个使用通配符子域的项目,比如user.mysite.com,其中用户名是通配符 在我的服务器(PHP)中,我设置了以下标题: header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Credentials: true'); 这允许我从前端进行ajax调用,因为我不知道该域将是什么。但是,我还需要发送cookie,请求维护会话,但当我告诉前端的AngularJS发送凭据时,我收到以下消息: A wildc

我有一个使用通配符子域的项目,比如
user.mysite.com
,其中用户名是通配符

在我的服务器(PHP)中,我设置了以下标题:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Credentials: true');
这允许我从前端进行ajax调用,因为我不知道该域将是什么。但是,我还需要发送cookie,请求维护会话,但当我告诉前端的AngularJS发送凭据时,我收到以下消息:

A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true
我知道这是出于安全原因,但现在我无法在我的应用程序中进行会话管理。有人能建议一个解决方法吗

我告诉Angular发送凭据的位置:

$httpProvider.defaults.withCredentials = true;
我的ajax请求正在发送到另一个子域。ie url可以是
billy.mysite.com
,但是ajax请求被发送到
api.mysite.com
,在注释中是正确的:


只需获取当前请求的主机,并使用它而不是通配符

也就是说,做一些类似于:

header('Access-Control-Allow-Origin:'。$requestHeaders['Host'])

不要这样做

这正是你所要求的,它解决了问题。基本上相当于
标题('Access-Control-Allow-Origin:*)
这样做实际上意味着用户进入的任何站点都可以代表用户做任何事情,而无需征得用户的同意或通知,因为您将
访问控制允许源站
转发给发送的任何主机,并允许该主机传输原始用户的cookie(如果在浏览器中为您的API设置了cookie)


相反,在中继之前,您应该始终筛选主机。执行某种类型的白名单检查或regexp检查,只有通过了,才将
主机
中继到
访问控制允许源站

@iamjonesy-你犯了愚蠢的错误

"A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true" 
要避免上述错误,只需执行以下步骤。 假设您的api服务器是http://api.com。您执行ajax调用的UI服务器是http://ui.com

PHP头代码应该如下所示:

header('Access-Control-Allow-Origin: http://ui.com');
header('Access-Control-Allow-Credentials: true');
在angular config.js中放入下面的行

$httpProvider.defaults.withCredentials = true;

我所做的是,从未将“*”设置为$httpProvider.defaults的通配符。使用凭据时,只需提及ajax代码所在的完整域名即可

只需获取当前请求的主机并使用它而不是通配符为什么我没有想到?!谢谢@peehaaca,主机不会被欺骗吗?如果你已经有了cookie,你当然可以欺骗主机或者只是把cookie放在你的浏览器中。但是,如果您按照建议执行CORS,您可以诱使用户访问恶意站点以模拟他。用户没有在那里输入他们的登录名,甚至不知道该站点做了什么。在任何时候都不需要窃取cookie。我们有一个servicestack服务器(具有已知端点)和多个具有未知端点的UI服务器。我们希望UI服务器用户能够通过编写cookie对servicestack服务进行身份验证。我认为添加withCredentials可以做到这一点,但servicestack服务器如何允许未知UI访问JSON服务响应?@CoreyAlix我正在寻找解决同一问题的方法。我们如何允许对未知域执行此操作?如果您找到了解决方案,请在此处发布。@dev_musings我切换到了JSONP。@dev musings,JSONP不是答案,因为我们的服务并不都是GET服务。我们必须引入应用服务器的白名单。我认为没有解决办法。@CoreyAlix从安全角度来看,现代浏览器拒绝来自未知/未经验证端点的响应。使用JSONP不是解决方案,因为它只支持GET方法。您可以做的一件事是,在构建API时,可以通过任何开源命令行工具和库(CURL/urllib2)访问这些未知端点。我想这可能对你有帮助。