我知道有很多关于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");
}
请告知这种工作方式。如果它不安全或根本没有好处,请告诉我如何解决这个问题?
非常感谢!
答案 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添加到允许的方法。