在 Web 应用中,如果通过 fetch
Hook 代码监控网络请求,但发现通过 Blob
或动态生成的 JS 代码发出的 fetch
请求未被捕获,可能是由于以下原因及解决方案:
1. Hook 时机问题
- 原因:Hook 代码可能仅在页面初始加载时执行,而动态生成的 JS(如通过
Blob
、eval
或new 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 }); });
- 监听 Worker/iframe 内的通信:如果动态代码运行在 Worker 中,需通过
3. JS Bundler/Script Injection
原因:第三方库或打包工具可能直接使用原生的
XMLHttpRequest
或其他方式绕过fetch
。解决方案:
- 同时劫持其他请求方法:
const originalXHROpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url) { console.log('XHR intercepted:', method, url); originalXHROpen.apply(this, arguments); };
- 使用 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/跨域限制
- 原因:某些跨域请求可能因浏览器安全策略无法被正常捕获。
- 解决方案:
- 确保同源策略允许监控:检查是否存在跨域限制(如不同子域名)。
- 代理请求至同源后端:将跨域请求转发到同源服务器端处理。
5. Shadow DOM/隔离环境
- 原因:部分框架(如微前端)可能将代码运行在 Shadow DOM 或闭包中,导致全局 Hook 失效。
- 解决方案:
- 遍历所有 iframe/Shadow DOM:
document.querySelectorAll('iframe').forEach(iframe => { try { iframe.contentWindow.fetch = window.fetch; // Propagate hook } catch (e) { /* Handle CORS */ } });
- 遍历所有 iframe/Shadow DOM:
验证步骤
- 检查动态生成的 JS 代码是否调用了原生
fetch
。 - 使用浏览器开发者工具的 Network面板 > Fetch/XHR筛选器,确认请求是否可见。
- 如果是第三方脚本,尝试反编译或调试其源码。
通过以上方法可覆盖绝大多数漏捕场景。若仍不生效,可能需要结合具体场景进一步分析。
内容由零声教学AI助手提供,问题来源于学员提问