沙箱
进程沙箱是 Chromium 的操作系统级限制。渲染进程被放进沙箱后,即使页面脚本或渲染引擎出现漏洞,这个进程能做的系统调用也很少。
webPreferences.sandbox 自 Electron 20 起默认为 true。官方文档同时说明两点:
- 它和
nodeIntegration不是同一个开关。沙箱开启后,预加载脚本只能使用有限的 Electron API。 nodeIntegration: true会自动关闭沙箱。- 关闭
contextIsolation也会关闭沙箱,即使你把sandbox写成true。
沙箱里的预加载脚本
可以 require('electron') 并使用 ipcRenderer、contextBridge、webFrame 等模块。不能 require('fs') 或任意 npm 包。需要读文件时,发 IPC 给主进程。
和上下文隔离的分工
| 机制 | 限制的是什么 |
|---|---|
nodeIntegration: false | 页面脚本不能直接调用 Node |
contextIsolation: true | 页面脚本不能碰预加载脚本的 JavaScript 对象 |
sandbox: true | 渲染进程的操作系统权限 |
三层一起开,才是官方安全清单里的基线。
还可以用应用级开关强制所有渲染进程进入沙箱。个别窗口若因为遗留代码关掉沙箱,要在代码里写明原因。