如何防止在 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 扩展中的 Access-Control-Allow-Origin 错误