19

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

所以我有一个用 Angular 编写的客户端应用程序,它将用于创建一个移动应用程序(使用 Apache Cordova)。html 文件和 JavaScript 文件将从移动设备加载。当我模拟它并向 REST API 服务器发送请求时,我首先得到“请求的资源上不存在‘Access-Control-Allow-Origin’标头。http://localhost:82因此,Origin '' 不允许访问”。所以我添加了 header("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");
}

请就这种工作方式提出建议。如果它不安全或根本没有好处,你能告诉我如何解决这个问题吗?

非常感谢!

4

1 回答 1

15

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

就安全而言,请注意@Jules 在这篇文章中关于 CORS的评论:

请注意,将 HTTP Origin 值作为允许的来源发回将允许任何人使用 cookie 向您发送请求,因此可能会从登录您的站点然后查看攻击者页面的用户那里窃取会话。您要么想要发送“*”(这将禁止 cookie 从而防止会话窃取),要么想要发送您希望站点为其工作的特定域。

有关示例,另请参见以下内容:

Access-Control-Allow-Headers 不接受通配符

指定标头 Access-Control-Allow-Headers


替代方法

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

Access-Control-Allow-Origin: *

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

Access-Control-Allow-Credentials: true

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

Authorization: Basic a2lkMT==

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

于 2014-10-16T19:20:56.680 回答