Google chrome extension 从chrome扩展访问Websocket流量

Google chrome extension 从chrome扩展访问Websocket流量,google-chrome-extension,websocket,Google Chrome Extension,Websocket,有一个页面(游戏),通过WebSocket与服务器通信。我可以在Chrome开发者工具中看到数据(帧)。是否可以从chrom扩展访问/修改此通信?从上的讨论判断,与chrome.webRequest的正常请求不同,目前没有用于拦截WebSocket通信的API。它已分配,但尚未完成 编辑:最近(截至2016年11月)关于该漏洞的活动表明正在进行修补。目前,访问或修改Websocket流量的唯一方法是使用to,用自己的包装器替换Websocket构造函数。这个包装器的行为应该与最初的WebSock

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

从上的讨论判断,与chrome.webRequest的正常请求不同,目前没有用于拦截WebSocket通信的API。它已分配,但尚未完成


编辑:最近(截至2016年11月)关于该漏洞的活动表明正在进行修补。

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

为了防止网站崩溃,您必须确保
WebSocket
包装完全符合标准。必须实施的接口记录在

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


更多强调:确保您的实现符合标准WebSocket API的接口,否则可能会破坏某些站点

有一个WebSocket包装器,您可以使用它访问WebSocket流量:


我遇到了这个问题并尝试了上面的解决方案,不幸的是,我的目标站点中的脚本仍然发现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
,只需定期检查它并使用您自己的函数重新分配它。

似乎是固定的且可用的。在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);

考虑到内容脚本具有沙盒执行环境,这将如何工作?它不会取代该页面使用的
WebSockets
。@Xan请按照我回答中的“注入脚本”链接进行操作。“天哪,它全是星星!”-谢谢分享谢谢!我已经尝试将我的脚本注入DOM。他们使用DojoCometd进行webSocket通信。我的想法是覆盖org.cometd.WebSocketTransport的onMessage函数。问题是:我的script.js在org.cometd的js-loaded->org未定义之前激发。(虽然如果我使用console.log(org)我可以看到它)。这是cometd.js,WebSocketTransport函数在第565行。而且仍然没有API(6年的人),可能他们不想将它添加到chrome中,因为扩展会滥用它太多