Angular:当credentials标志为true时,不能在'Access-Control-Allow-Origin'标头中使用通配符'*'

时间:2014-10-16 18:32:51

标签: angular rest cordova ionic-framework cors

我知道有很多关于CORS的问题,但它们似乎没有回答我的问题。

所以我有一个用Angular编写的客户端应用程序,用于创建移动应用程序(使用Apache Cordova)。将从移动设备加载html文件和JavaScript文件。 当我模拟它并向REST API服务器发送请求时,我首先得到了 “所请求的资源上没有'Access-Control-Allow-Origin'标题。因此不允许原点'http://localhost:82'访问”。 所以我添加了标题(“Access-Control-Allow-Origin:*”);在我的PHP REST API服务器中。我无法指定特定域,因为请求将来自移动设备。

现在我知道“凭证标志为真时,'通配符'*'不能在'Access-Control-Allow-Origin'标题中使用。”

我终于找到了一个解决方案,但我不确定这样做是否安全。

在我的php REST API服务器中,我添加了这个:

if (isset($_SERVER['HTTP_ORIGIN'])) {
   header("Access-Control-Allow-Credentials: true");
   header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']);
   header("Access-Control-Allow-Headers: *, X-Requested-With, Content-Type");
   header("Access-Control-Allow-Methods: GET, POST, DELETE, PUT");
}

请告知这种工作方式。如果它不安全或根本没有好处,请告诉我如何解决这个问题?

非常感谢!

1 个答案:

答案 0 :(得分:10)

响应应该只有Access-Control-Allow-Headers中的接受标头,不要使用通配符。

就安全而言,请注意@Jules在此post about CORS中的评论:

  

请注意,将HTTP Origin值作为允许的原点发回   会允许任何人       使用cookie向您发送请求,从而潜在地窃取用户的会话       谁登录到您的网站然后查看了攻击者的页面。你想要发送'*'       (这将禁止cookie,从而防止会话窃取)或特定域       你想让网站工作。

参见以下示例:

Wildcard not accepted in Access-Control-Allow-Headers

Specify headers Access-Control-Allow-Headers


替代方法

您可以将原始标题设置为:

Access-Control-Allow-Origin: *

如果您不需要在请求中包含Cookie,请删除:

Access-Control-Allow-Credentials: true

从Access-Control-Allow-Headers中删除通配符并添加授权,然后将该标头作为授权请求的一部分传递,而不是在cookie中传递凭据,例如:

Authorization: Basic a2lkMT==

此外,将OPTIONS添加到允许的方法。