我正在尝试连接到外部Web套接字服务器,该服务器不由我自己运行。我想从localhost javascript文件连接到它,因此origin标头具有空值。
据我所知,这是针对跨站点伪造的措施。但是,因为我在localhost上,所以我应该能够通过让Chrome发送一个自定义的Origin标头来伪装它。
有可能吗? (如果我需要扩展,那很好)
如果没有,实现上述目标的最佳选择是什么?谢谢。
答案 0 :(得分:11)
网页无法更改Origin标头,但扩展程序可以通过chrome.webRequest API修改请求标头。但是这个API ws://
and wss://
are not supported,所以除非服务器还支持通过http(s)进行其他通信方式(例如长轮询),否则这无济于事。
但仍有一个解决方案:只需在iframe(例如https://example.com/favicon.ico
或https://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的此类选项。但是,最后一个选项需要一个插件才能欺骗原始标题,因此我建议使用第一个选项。