ZBLOG

在web应用的每一个HTML页面都加入了fetch的hook代码,blob请求获取的JS代码发出的fetch请求没有走进hook流程

在 Web 应用中,如果通过 fetch Hook 代码监控网络请求,但发现通过 Blob 或动态生成的 JS 代码发出的 fetch 请求未被捕获,可能是由于以下原因及解决方案:


1. Hook 时机问题

  • 原因:Hook 代码可能仅在页面初始加载时执行,而动态生成的 JS(如通过 Blobevalnew Function())在后续执行时未重新应用 Hook。
  • 解决方案
    • 重写原生 fetch:在页面加载的最早阶段(如 <head> 中)劫持原生 fetch,确保后续所有调用均经过 Hook。
    const originalFetch = window.fetch;
    window.fetch = function(...args) {
      console.log('Fetch intercepted:', args);
      return originalFetch.apply(this, args);
    };
    

2. Blob URL 的隔离性

  • 原因:通过 Blob 生成的脚本可能运行在独立的上下文中(如 Worker 或沙盒化的 <iframe>),无法共享主页面的 Hook。

  • 解决方案

    • 监听 Worker/iframe 内的通信:如果动态代码运行在 Worker 中,需通过 postMessage 与主线程交互。
    // Main thread
    const worker = new Worker(URL.createObjectURL(blob));
    worker.onmessage = (e) => {
      console.log('Worker fetch request:', e.data);
    };
    
    
    // Worker script (需修改动态JS代码)
    fetch('https://api.example.com').then(response => {
      self.postMessage({ type: 'fetch', url: response.url });
    });
    

3. JS Bundler/Script Injection

  • 原因:第三方库或打包工具可能直接使用原生的 XMLHttpRequest 或其他方式绕过 fetch

  • 解决方案

    1. 同时劫持其他请求方法
      
      const originalXHROpen = XMLHttpRequest.prototype.open;
      XMLHttpRequest.prototype.open = function(method, url) {
      console.log('XHR intercepted:', method, url);
      originalXHROpen.apply(this, arguments);
      };
      
    2. 使用 Service Worker:拦截所有网络请求(需 HTTPS)。 “`javascript // Register service-worker.js navigator.serviceWorker.register(‘/sw.js’).then(() => { console.log(‘Service Worker registered’); });

    // sw.js self.addEventListener(‘fetch’, (event) => { console.log(‘Caught fetch:’, event.request.url); event.respondWith(fetch(event.request)); }); “`


4. CORS/跨域限制

  • 原因:某些跨域请求可能因浏览器安全策略无法被正常捕获。
  • 解决方案
    1. 确保同源策略允许监控:检查是否存在跨域限制(如不同子域名)。
    2. 代理请求至同源后端:将跨域请求转发到同源服务器端处理。

5. Shadow DOM/隔离环境

  • 原因:部分框架(如微前端)可能将代码运行在 Shadow DOM 或闭包中,导致全局 Hook 失效。
  • 解决方案
    1. 遍历所有 iframe/Shadow DOM
      
      document.querySelectorAll('iframe').forEach(iframe => {
      try {
       iframe.contentWindow.fetch = window.fetch; // Propagate hook
      } catch (e) { /* Handle CORS */ }
      });
      

验证步骤

  1. 检查动态生成的 JS 代码是否调用了原生 fetch
  2. 使用浏览器开发者工具的 Network面板 > Fetch/XHR筛选器,确认请求是否可见。
  3. 如果是第三方脚本,尝试反编译或调试其源码。

通过以上方法可覆盖绝大多数漏捕场景。若仍不生效,可能需要结合具体场景进一步分析。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23203

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?