从chrome扩展访问Websocket流量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从chrome扩展访问Websocket流量相关的知识,希望对你有一定的参考价值。

有一个页面(游戏),它通过WebSocket与服务器通信。我可以在Chrome开发者工具中看到数据(框架)。是否可以从chrom-extension访问/修改此通信?

答案

目前,访问或修改Websocket流量的唯一方法是使用content scriptinject a script,用自己的包装器替换WebSocket构造函数。此包装器的行为应与原始WebSocket实现类似,但您可以添加更多内容,例如将已发送/已接收的消息记录到您的扩展中。

为防止站点损坏,您必须确保WebSocket包装器完全符合标准。 http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#the-websocket-interface记录了必须实现的接口。

有关如何包装DOM构造函数的灵感,请参阅例如我的wrapper for Worker。您可以自由地重用部分代码(例如EventTarget接口的实现,这也是WebSocket API的要求)。

更多重点:确保您的实现遵循标准WebSocket API的接口,或者您可以破坏一些站点!

另一答案

从对this bug的讨论来看,目前没有用于拦截WebSocket流量的API,这与使用chrome.webRequest的正常请求不同。它已分配但尚未完成。

编辑:最近(截至2016年11月)该bug的活动建议修补工程。

另一答案

有一个WebSocket-Wrapper,您可以使用它来访问WebSocket流量:

https://github.com/gorhill/chromium-websocket-wrapper/blob/master/chromium-websocket-wrapper.js

另一答案

似乎bug是固定和可用的。在manifest.json中,您需要显式指定权限

{
    ...
    "permissions": ["webRequest", "ws://*/*", "wss://*/*"]
    ...
}

在网络过滤器中,它应该被指定为websocket请求。

const networkFilters = {
    urls: [
        "wss://echo.websocket.org/*"
    ]
};
chrome.webRequest.onBeforeRequest.addListener((details) => {
    const { tabId, requestId } = details;
    // do stuff here
}, networkFilters);
另一答案

我遇到了这个问题并尝试了上面的解决方案,遗憾的是我的目标网站中的脚本仍然发现WebSocket已被篡改并破坏,这很糟糕。

所以我想出了自己的解决方案:

var ws = window.WebSocket;
window.WebSocket = function(a,b){
var ret = new ws(a,b);
let handle = setInterval(function(){
                  if(ret.onmessage){
                     clearInterval(handle);
                     let o = ret.onmessage;
                     ret.onmessage = function(m){
                                       //do what your want to m
                                       o(m);
                                     };
                   }
                   },50);
                   return ret;
              }

如果你要检查的站点确实使用了WebSocket,我肯定会在创建WebSocket对象后的某个时候分配给onmessage,只需定期检查它并用你自己的函数重新分配它。

以上是关于从chrome扩展访问Websocket流量的主要内容,如果未能解决你的问题,请参考以下文章

如何从chrome扩展获取系统代理设置?

如何从 chrome 扩展访问 iframe?

如何从 background.js 访问变量以在 chrome 扩展中弹出

我可以从 NodeJs 服务器访问网页上的网络流量数据吗?

无法通过 Chrome 扩展连接到使用 Spring 创建的简单 websocket 服务器

如何嗅探在 swf 中处理的 wss (websocket) 流量?