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

mve*_*and 17 rest cors cordova ionic-framework angular

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

所以我有一个用Angular编写的客户端应用程序,用于创建移动应用程序(使用Apache Cordova).将从移动设备加载html文件和JavaScript文件.当我模拟这个并且我向REST API服务器发送请求时,我首先得到"No'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");
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢!

Bat*_*cid 12

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

至于它是安全的,请注意@Jules在这篇关于CORS的帖子中的评论:

请注意,将HTTP Origin值作为允许来源发回将允许任何人使用cookie向您发送请求,从而可能会从登录您站点的用户窃取会话,然后查看攻击者的页面.您要么发送'*'(这将禁止cookie,从而阻止会话窃取)或您希望该网站工作的特定域.

另请参阅以下示例:

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

指定标头Access-Control-Allow-Headers


替代方法

您只需将origin标头设置为:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

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

Access-Control-Allow-Credentials: true
Run Code Online (Sandbox Code Playgroud)

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

Authorization: Basic a2lkMT==
Run Code Online (Sandbox Code Playgroud)

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

  • 如上所述“Access-Control-Allow-Origin:*”不起作用。我确实需要 cookie 和“Access-Control-Allow-Origin:*”的组合,并且似乎不允许发送 cookie。 (2认同)

归档时间:

查看次数:

57526 次

最近记录:

7 年 前