如何防止在 Chrome 中发送 Origin HTTP 标头?

Posted

技术标签:

【中文标题】如何防止在 Chrome 中发送 Origin HTTP 标头?【英文标题】:How to prevent sending Origin HTTP header in Chrome? 【发布时间】:2017-10-17 01:30:42 【问题描述】:

情况:

    我有一个生产网络服务器,比如说https://example.com,配置了CORS,允许的来源有限。该集合不包括本地主机来源。 在 localhost 上,开发人员开发一个页面/模块/需要通过 AJAX 调用生产 Web 服务器的任何内容(即使在开发过程中)。为此,他们使用 CLI 参数 --disable-web-security --user-data-dir=chromeNoCors 运行 Chrome,以便 Chrome 发送不带 Origin 标头的 AJAX。 问题是只发送 GET 请求而没有标头。 POST 请求仍然包含标头,因此生产服务器将标头值 (http://localhost:5678) 与允许的来源集进行比较,并禁止访问请求的资源。

问题: 是否有可能以某种方式完全阻止发送 Origin HTTP 标头?

我知道有一种解决方法可以解决这种情况,方法是允许“localhost”(或开发人员必须添加到其 /etc/hosts 中的某些特定主机)到生产服务器上允许的来源集,但我'如果可能,我不想这样做。

【问题讨论】:

“在 localhost 上,开发人员开发了一个页面/模块/任何需要通过 AJAX 调用生产 Web 服务器的东西(即使在开发过程中)”——听起来你正试图绕过一个开发环境不能胜任这份工作。你应该改正那个问题。 【参考方案1】:

如果你们使用 chrome 试试这个扩展 https://chrome.google.com/webstore/detail/requestly-redirect-url-mo/mdnleldcmiljblolnjhpnblkcekpdkpa

您可以即时修改请求,甚至是标题

【讨论】:

谢谢,这很好用,而且设置起来也很简单,这正是我所需要的,所以我会接受这个作为答案。一般来说,使用代理可能会更健壮。 @Lorenzo 在这里请求开发人员。 Requestly 也适用于 Firefox。结帐requestly.in【参考方案2】:

我建议您设置一个简单的“代理服务器”(简短的 node.js 或 python 脚本就足够了)。让此服务器将所有请求转发到您的远程 API 服务器,但删除标头中有关来源的信息。这是一个简单的正则表达式问题。

这是一个简单的解决方案,可以移植到不同的服务器。在 AJAX 方面,您只需将主机名更改为测试代理服务器的 localhost 或 IP。

【讨论】:

是的,如果使用的所有 URL 都在我的控制之下,那么使用反向代理就可以了,这样我就可以将它们更改为 localhost。就我而言,生产网络服务器中使用的一些模块可能会使用硬编码的 URL,这会使它们无法正常工作。 使用普通(非反向)代理实际上也是一种解决方案,可以跨浏览器和移动设备工作,但由于 https 的原因,设置并不完全简单。代理将充当 MITM,必须具有自签名证书,该证书应该以受信任的方式安装,或者开发人员每次都必须接受异常;浏览器必须配置为使用代理; HSTS Key Pinning 可能存在问题(可能也需要删除)。 首先,afaik 本地代理服务器对 HTTPS 没有问题。但最重要的是,我的意思是您应该将调试过程的客户端脚本中的目标 URL 更改为代理服务器 URL。您的代码应该足够模块化以能够做到这一点。任何来自远程服务器的硬编码 url 都可以通过代理脚本进行更改。

以上是关于如何防止在 Chrome 中发送 Origin HTTP 标头?的主要内容,如果未能解决你的问题,请参考以下文章

缓存跨域资产时,Chrome 应用程序缓存不发送“Origin”标头

Chrome 扩展中的 Origin 标头

如何实现 iFrame 通信以防止跨源错误?

chrome 扩展中的 Access-Control-Allow-Origin 错误

连接到 WebSocket 时如何覆盖 Chrome 中的 Origin 标头?

来自 Flash 的 Chrome 80 POST:无 cookie,Origin null(非跨站点)