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

How can I override the Origin header in Chrome when connecting to a WebSocket?

我正在尝试连接到外部网络套接字服务器,我自己不是 运行。我想从本地主机 javascript 文件连接到它,因此原点 header 具有空值。

我了解这是针对 cross-site 伪造的措施。但是,由于我在本地主机上,我应该能够通过让 Chrome 发送自定义 Origin header.

来伪造它

可能吗? (如果我需要延期,那很好)

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

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

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

Here 是一个扩展,您可以使用它来动态操作 header,但到目前为止我还无法使用它来操作套接字 headers。

如果您想阅读更多相关信息,请查看 here

但这并不能阻止您实施自己的客户端(代替 chrome),您可以在其中直接发送任何 header想要,不知道对你有没有帮助,抱歉。

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

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

网页无法更改 Origin header,但扩展程序可以通过 chrome.webRequest API. But ws:// and wss:// are not supported 通过此 API 修改请求 header,因此这无济于事除非服务器还支持通过 http(s) 的其他通信方式(例如 long-polling)。

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

这取决于您希望如何使用 chrome 浏览器。既然你提到 localhost 我假设你开发并将使用它进行某种抓取。我建议您探索 Chrome DevTools Protocol which will render (almost) any kind of protection useless because you use a real browser. CORS, Origin, Cookie or any arbitrary header value will be under your control, and you can send a custom header for xhr/websocket request(s). If you want to manipulate in a more advanced way you can use Network.continueInterceptedRequest. You might only want to start chrome using parameters like "--disable-web-security, --disable-xss-auditor, --disable-client-side-phishing-detection, --allow-insecure-localhost" more about such options at peter.sh。但是,最后一个选项需要一个插件才能欺骗来源 header 所以我推荐第一个选项。