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

Posted

技术标签:

【中文标题】连接到 WebSocket 时如何覆盖 Chrome 中的 Origin 标头?【英文标题】:How can I override the Origin header in Chrome when connecting to a WebSocket? 【发布时间】:2015-07-29 05:53:27 【问题描述】:

我正在尝试连接到外部网络套接字服务器,该服务器不是由我自己运行。我想从 localhost javascript 文件连接到它,因此原始标头具有空值。

我了解这是针对跨站点伪造的措施。但是,由于我在本地主机上,我应该能够通过让 Chrome 发送自定义 Origin 标头来伪造它。

有可能吗? (如果我需要扩展,那很好)

如果不是,实现上述目标的最佳选择是什么?谢谢。

【问题讨论】:

【参考方案1】:

网页无法更改 Origin 标头,但扩展可以通过 chrome.webRequest API 修改请求标头。但是 ws:// and wss:// are not supported 通过这个 API,所以除非服务器还支持通过 http(s) 的其他通信方式(例如长轮询),否则这无济于事。

仍然有一个解决方案:只需在 iframe 中的所需来源(例如 https://example.com/favicon.icohttps://example.com/robots.txt)加载(已知)网页,然后使用 content script 从那里打开 WebSocket。

【讨论】:

感谢您的提示,我会在周末尝试并回来。【参考方案2】:

Origin 标头是由用户代理自动设置的标头之一(作为浏览器实现的一部分),不能以编程方式或通过扩展进行更改。这是有道理的,因为 Web 服务提供商不能允许来自本地主机的随机连接。

只有在 Web 服务提供商明确接受的主机上进行连接时,才能连接到外部 WebSocket。许多标头是不可信的(因为它们可以被覆盖),但Origin 的情况并非如此,因为它不仅为用户提供了安全性,还为服务提供商提供了防止不必要的连接的安全性。

【讨论】:

有些东西我不明白。该服务如何确保我没有提供虚假来源?为什么我不能进入 Chrome 的源代码并修改限制部分或构建我自己的没有此类限制的浏览器?我猜,有一个设计原则不让我做,但它是什么? 好的,我检查了 RFC,它说:“目的不是阻止非浏览器建立连接,而是确保受潜在恶意 JavaScript 控制的受信任浏览器不能伪造 WebSocket握手。”基于此,我认为,源头只是为了防止恶意网站在用户不知情的情况下从用户的浏览器连接到第三方网络套接字。 这种情况下的服务提供者只验证 Origin 标头并相信它是不妥协的。当然,理论上您可以篡改浏览器代码或创建用于自定义 HTTP 请求的工具,但这并非易事且不推荐。是的,Origin 标头首先针对用户安全。它或多或少与在 robots.txt 文件中明确禁止这一点的抓取网站相同(没有人能保证它会被遵守)。 该服务无法确保您提供的来源合法,但可以确保其他用户不会被您的网站欺骗连接到需要正确来源的第三方。 @DavidFrank 是的,您可以创建一个浏览器来执行此操作,但是您如何强制其他人使用您修改后的浏览器?如果您是唯一使用不安全浏览器的人,您只会伤害自己。我们相信 Apple/Google/Mozilla 会为我们提供阻止修改 Origin 标头的浏览器。【参考方案3】:

据我所知,这是不可能的,它会破坏 Chrome 中针对 CSRF 的安全防护。

如果你能做到这一点,XHR 的整个概念就会分崩离析。

Here 是一个扩展,您可以使用它来即时操作标头,但到目前为止,我还不能让它来操作套接字标头。

如果您想了解更多信息,请查看here。

但这并不能阻止您实现自己的客户端(代替 chrome),您可以在其中发送您想要的任何标头,但不确定这是否对您有帮助,抱歉。

【讨论】:

通常有针对 CSRF 的安全防护措施来保护用户。然而,在这种情况下,我(作为用户)的意图是为 chrome 添加一个例外以削弱这种保护。由于chrome创建并发送http请求,理论上我应该能够覆盖任何标题(可能使用扩展名)。 我将添加一个我发现允许修改标题的扩展。由于某种原因,我能够修改标题,但在使用套接字时还没有。【参考方案4】:

这取决于你想如何使用你的 chrome 浏览器。既然你提到了 localhost 我假设你开发并将使用它进行某种抓取。我建议您探索Chrome DevTools Protocol,因为您使用的是真正的浏览器,这将使(几乎)任何类型的保护都无用。 CORS、Origin、Cookie 或任何任意标头值都在您的控制之下,您可以为 xhr/websocket 请求发送自定义标头。如果您想以更高级的方式进行操作,可以使用 Network.continueInterceptedRequest。您可能只想使用“--disable-web-security、--disable-xss-auditor、--disable-client-side-phishing-detection、--allow-insecure-localhost”等参数启动 chrome peter.sh 的选项。但是,最后一个选项需要一个插件来欺骗源头,所以我推荐第一个选项。

【讨论】:

以上是关于连接到 WebSocket 时如何覆盖 Chrome 中的 Origin 标头?的主要内容,如果未能解决你的问题,请参考以下文章

连接到 WebSocket 时如何修复“Access-Control-Allow-Origin”错误?

如何在连接到节点上的 websocket 服务器时传递消息

OkHttp Websockets - 连接到 websocket 时添加一个主体

如何使用 websocket 安全地将我的 cli 应用程序连接到网站

关闭连接后如何重新连接到websocket [重复]

如何将 Cowboy (Erlang) websocket 连接到 webflow.io 生成的网页