无法解决的 CORS 问题!如何在 MacOS 上禁用 Chrome 的同源策略?

Posted

技术标签:

【中文标题】无法解决的 CORS 问题!如何在 MacOS 上禁用 Chrome 的同源策略?【英文标题】:Unresolvable CORS issue! How to disable the same origin policy of Chrome on MacOS? 【发布时间】:2018-05-25 23:09:31 【问题描述】:

有一段时间,我一直面临关于 CORS 的问题。我正在使用localhost 运行一个 ExtJS 应用程序,并且在删除过程的 REST 过程中,它不断给出这个错误:

Response for preflight has invalid HTTP status code 403.

我已经接触过这些话题了;

几个 CORS 问题和要修复的想法@https://***.com/a/35588856/7163711 禁用 Chrome 网络安全@https://***.com/a/3177718/7163711

我做了几件事,但没有一个对我有用!

使用 CORS 的扩展程序:Allow-Control-Allow-Origin: * 这是扩展程序设置的屏幕截图:

我在 MacOS 上安装了 Chrome Canary,并使用 web-security-disabled 运行它。浏览器使用 FLAG 打开,并注意到这是禁用 web 安全的 mod,但不知何故,它的行为不符合预期。这是我用来运行它的终端命令:

open -a /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --args --disable-web-security --/ChromeDisabled

但它的效果并不好!那么我做错了什么?我该如何解决这个问题?

【问题讨论】:

您在后端使用哪个服务器或框架? @DeepakKumarTP 我们正在使用 java 服务器和 Spring 框架。 可能的解决方案*** 【参考方案1】:

我猜你想解决它为什么给出错误 403 的难题。问题出在服务器端,而不是浏览器或 ExtJS。

错误 403 表示“未经授权”。那么,你为什么未经授权?什么是“预检”?

预检请求是浏览器使用OPTIONS HTTP 方法发送到后端的特殊请求。它在实际请求之前发送,并且在发送时没有标头、cookie 或其他身份验证数据。它不应该返回数据,只有几个标头指示允许从哪些域 CORS 请求访问 URL,以及它们可以发送哪些方法和标头。如果浏览器发现响应信息允许它发送实际请求,就会发送实际请求并处理返回的数据。

因此,为了支持 CORS,针对后端的 OPTIONS 请求必须始终未经身份验证,因为无法发送身份验证信息。 但是,您的后端不允许 OPTIONS 请求未经身份验证通过。

您可能想要检查您使用的身份验证代码,并尝试获取有关身份验证的 OPTIONS 请求(当然,那时它们不应返回任何数据)。我对您的后端技术一无所知,您可能想用正确的标签在另一个问题中问如何解决这个问题;在 C# 中是这样的(我猜你有类似的功能供你使用):

[HttpOptions]
[AllowAnonymous]
public HttpResponseMessage GenerateDemoKey() 
    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.Headers.Add("Access-Control-Allow-Origin", "*");
    response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
    response.Headers.Add("Access-Control-Allow-Headers", "Origin, Content-Type, X-Auth-Token, X-Requested-With, Authorization");
    return response;

所以,如果它是一个OPTIONS 请求(第 1 行),到 URL .../GenerateDemoKey(第 3 行)它可能会通过未经授权(第 2 行),并且状态为 200:OK(第 4 行)的响应有添加的标头告诉浏览器允许来自任何域的站点访问真实 URL(第 5 行),只要它们使用六个命名方法之一(第 6 行)并仅发送五个命名标头(第 7 行)。

另一方面,在 php 中,您会在脚本的开头添加一个 if 块,在处理身份验证之前

<?php
if($_SERVER['REQUEST_METHOD']=="OPTIONS") 
    header("Access-Control-Allow-Origin: *")
    header("Access-Control-Allow-Methods: GET, POST*")
    header("Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token, X-Requested-With, Authorization")
    exit(0);

如果您使用 htaccess 进行身份验证,您可能必须在 htaccess 文件中添加规则以允许 OPTIONS 请求通过。使用 htaccess 和 PHP 的组合存在巨大的安全风险 - 请确保仅将那些您检查过的 URL 列入白名单,在使用 OPTIONS 方法调用时不会返回私人信息。

【讨论】:

亚历山大,你是对的!问题发生在服务器端。实际上在tomcat 设置上。 DevOps 已经配置好 CORS 设置,现在它运行没有任何问题。非常感谢!

以上是关于无法解决的 CORS 问题!如何在 MacOS 上禁用 Chrome 的同源策略?的主要内容,如果未能解决你的问题,请参考以下文章

Webpack devserver 代理无法解决 CORS 问题

如何解决无法通过浏览器扩展解决的 CORS 错误?

无法在 macOS X 上安装 ghostscript

无法在 macOS Sierra 上运行旧版本的 Xcode

无法在我的快递应用中解决 CORS 政策

如何解决本地系统上的 Cors 问题?