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

时间:2015-05-17 19:22:42

标签: javascript google-chrome websocket

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

据我所知,这是针对跨站点伪造的措施。但是,因为我在localhost上,所以我应该能够通过让Chrome发送一个自定义的Origin标头来伪装它。

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

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

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

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

只有从Web服务提供商明确接受的主机执行此操作时,才能连接到外部WebSocket。许多标头不可信(因为它们可以被覆盖),但Origin不是这种情况,因为它不仅为用户提供安全保护,而且还为服务提供商提供安全保护以防止不需要的连接。

答案 2 :(得分:2)

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

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

Here是一个可以用来动态操作标题的扩展,但到目前为止我还没能让它来操作套接字标题。

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

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

答案 3 :(得分:0)

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