我正在尝试连接到外部 Web 套接字服务器,该服务器不是由我自己运行。我想从本地主机 javascript 文件连接到它,因此原始标头具有空值。
我了解这是针对跨站伪造的措施。然而,由于我在本地主机上,我应该能够通过让 Chrome 发送自定义 Origin 标头来伪造这一点。
可能吗? (如果我需要延期,那没问题)
如果没有,实现上述目标的最佳选择是什么?谢谢你。
网页无法更改 Origin 标头,但扩展程序可以通过 chrome.webRequest API 修改请求标头。但是此 API 不支持
ws://
和 wss://
,因此除非服务器还支持通过 http(s) 进行其他通信方式(例如长轮询),否则这没有帮助。
仍然有一个解决方案:只需在 iframe 中的所需来源处加载(已知)网页(例如 https://example.com/favicon.ico
或
https://example.com/robots.txt
),然后使用内容脚本 从那里打开 WebSocket。
Origin
标头是由用户代理自动设置的标头之一(作为浏览器实现的一部分),并且不能以编程方式或通过扩展进行更改。这是有道理的,因为 Web 服务提供商不允许来自本地主机的随机连接。仅当您从 Web 服务提供商明确接受的主机上进行连接时,才可以连接到外部 WebSocket。许多标头不可信(因为它们可以被覆盖),但
Origin
的情况并非如此,因为它不仅为用户提供安全性,还为服务提供商提供针对不需要的连接的安全性。
如果你能够做到这一点,XHR 的整个概念就会崩溃。
这里是一个扩展,您可以使用它来动态操作标头,但到目前为止我还无法让它来操作套接字标头。 如果您想了解更多相关信息,请查看
此处代替 chrome),您可以在其中发送您想要的任何标头,不确定这是否对您有帮助,抱歉。
,这将使(几乎)任何类型的保护变得毫无用处,因为您使用的是真正的浏览器。 CORS、Origin、Cookie 或任何任意标头值将在您的控制之下,并且您可以为 xhr/websocket 请求发送自定义标头。如果您想以更高级的方式进行操作,可以使用 Network.continueInterceptedRequest。您可能只想使用“--disable-web-security、--disable-xss-auditor、--disable-client-side-phishing-detection、--allow-insecure-localhost”等参数启动 chrome选项位于peter.sh。但是,最后一个选项需要一个插件才能欺骗原始标头,所以我推荐第一个选项。
//set the headers
socket.Options.SetRequestHeader("Authorization", authInfo.AuthToken);
//required, used for Auth on cara cloud side
socket.Options.SetRequestHeader("User-Agent", "XYZ Cara Connector");