跳到主要内容

nodeIntegrationInWorker 和 nodeIntegrationInSubFrames 为什么必须关?

考察点​

  • Node 能力不止主页面一份开关
  • iframe 和 Worker 是常见漏网

参考答案​

1. 两个开关​

webPreferences: {
nodeIntegration: false,
nodeIntegrationInWorker: false,
nodeIntegrationInSubFrames: false,
contextIsolation: true,
sandbox: true,
}

nodeIntegration: false 只保证顶层页面没有 Node。

  • nodeIntegrationInWorker:Web Worker 里能否 require
  • nodeIntegrationInSubFrames:iframe 里能否使用 Node 集成

这两个默认应保持关闭。打开任意一个,攻击者只要能在页面里创建 Worker 或 iframe,就还能碰到 Node,顶层关掉 Node 就没有意义。

2. 典型漏法​

有人说“主页面很安全,只有 Worker 要读文件”,于是打开 nodeIntegrationInWorker。页面脚本可以 new Worker(blobUrl),blob 里的内容来自字符串,XSS 就能把 Worker 源码换成自己的。

子框架同理。广告 iframe、预览 iframe 一旦和 Node 在一起,就和主页面打开 Node 等价。

3. Worker 要算大量数据时​

用普通 Web Worker,数据用 postMessage 传进去,不要给它 Node。要读文件,让主进程读好再把 ArrayBuffer 转交给 Worker。

子框架要系统能力,就不要它要。让顶层页面通过白名单桥去做,子框架只显示。

4. 检查方式​

在创建窗口的唯一工厂函数里写死这三个 false,不要每个窗口手写一份然后漏一个。代码审查搜 nodeIntegrationInWorker: true。

面试话术​

关掉 nodeIntegration 不够,Worker 和 iframe 还有各自的开关。这两个保持 false,否则 XSS 可以新开一个 Worker 继续 require。重计算用没有 Node 的 Web Worker,文件让主进程读。窗口工厂里把三个开关写死。

常见追问​

  • sandbox 开了是不是就不用管这两个? sandbox 能限制进程,但仍不要主动把 Node 集成打开。默认值会随版本变,显式写成 false。
  • preload 会进 iframe 吗? 子框架不一定执行父页面那份 preload。不要假设 iframe 里也有你的桥,更不要为了让它有桥去开 Node。