iam*_*esy 5 php ajax cors laravel angularjs
我有一个项目,我在其中使用通配符子域,例如user.mysite.com用户名是通配符。
在我的服务器 (PHP) 中,我设置了以下标头:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Credentials: true');
Run Code Online (Sandbox Code Playgroud)
这允许我从前端进行 ajax 调用,因为我不知道域将是什么。但是,我还需要将 cookie 与维护会话的请求一起发送,但是当我告诉前端的 AngularJS 发送凭据时,我收到以下消息:
A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true
Run Code Online (Sandbox Code Playgroud)
我知道这是出于安全原因,但现在我无法在我的应用程序中进行会话管理。任何人都可以为此提出解决方法吗?
我告诉 Angular 发送凭据的地方:
$httpProvider.defaults.withCredentials = true;
Run Code Online (Sandbox Code Playgroud)
我的 ajax 请求被发送到不同的子域。即 url 可能是,billy.mysite.com但 ajax 请求正在发送到api.mysite.com.
@iamjonesy - 你犯了愚蠢的错误。
"A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true"
Run Code Online (Sandbox Code Playgroud)
为避免上述错误,只需按照以下步骤操作即可。假设您的 api 服务器是http://api.com。您执行 ajax 调用的 UI 服务器是http://ui.com
PHP 标头代码应该是这样的,
header('Access-Control-Allow-Origin: http://ui.com');
header('Access-Control-Allow-Credentials: true');
Run Code Online (Sandbox Code Playgroud)
将以下行放在 angular config.js 中
$httpProvider.defaults.withCredentials = true;
Run Code Online (Sandbox Code Playgroud)
我所做的,从未将“ * ”设置为$httpProvider.defaults.withCredentials 的通配符,只需提及 ajax 代码所在的完整域名。
PeeHaa 的评论是正确的:
只需获取当前请求的主机并使用它代替通配符
也就是说,做类似的事情:
header('Access-Control-Allow-Origin: '.$requestHeaders['Host']);
不要这样做!
这正是您所要求的,它解决了问题。基本上,相当于header('Access-Control-Allow-Origin: *');但是,这会造成一个巨大的安全漏洞。
这样做实际上意味着您的用户输入的任何站点将能够在未经用户同意或通知的情况下代表您的用户执行任何操作,因为您将中继发送到Access-Control-Allow-Origin任何主机并允许该主机传输原始用户的 cookie(如果是)在浏览器中为您的 API 设置)。
相反,在转发之前,您应该始终过滤主机。实施某种白名单检查或正则表达式检查,只有在通过时,才将其转发Host到Access-Control-Allow-Origin.
| 归档时间: |
|
| 查看次数: |
9417 次 |
| 最近记录: |