commonjs在electron中主进程直接引入原生模块安全,渲染进程必须通过preload+contextbridge安全桥接暴露能力,禁用nodeintegration并校验ipc参数。

CommonJS 在 Electron 中引入 Node.js 原生模块本身不危险,真正需要防范的是**暴露方式不当导致的渲染进程越权访问**。主进程可直接 require 原生模块(如 fs、child_process),但渲染进程必须通过安全桥接机制调用,不能直接启用 nodeIntegration: true。
主进程中直接使用 CommonJS 引入原生模块
主进程运行在完整 Node.js 环境中,CommonJS 语法完全可用,无需额外配置:
-
直接 require 即可:例如
const fs = require('fs');、const path = require('path'); -
支持所有 Node.js 内置模块和 npm 安装的纯 JS 模块(如
axios、lodash) -
注意原生插件兼容性:若模块含 C++ 编译层(如
sqlite3、ffi-napi),必须为 Electron ABI 重新编译,否则会报NODE_MODULE_VERSION错误
渲染进程中安全暴露原生能力(必须用 preload + contextBridge)
禁用 nodeIntegration 是默认安全策略,因此不能在渲染进程里直接 require。正确做法是:
-
在 preload.js 中 require 原生模块,并通过
contextBridge.exposeInMainWorld()有选择地暴露精简接口 - 绝不传递原始模块对象或函数引用,只暴露封装后的、带参数校验和作用域限制的方法
- 示例:preload.js
const { contextBridge, ipcRenderer } = require('electron');<br>const fs = require('fs');<br><br>contextBridge.exposeInMainWorld('safeAPI', {<br> readConfig: (filename) => {<br> if (!filename.endsWith('.json')) throw new Error('Only JSON allowed');<br> return fs.readFileSync(`./config/${filename}`, 'utf8');<br> }<br>});
避免常见安全隐患
-
禁用
nodeIntegration: true:它会让渲染进程获得全局require,极易被 XSS 利用执行任意本地代码 -
不使用
enableRemoteModule: true(已废弃):远程模块存在严重安全缺陷,Electron 14+ 默认禁用 -
IPC 调用需校验参数类型与路径:比如接收文件路径时,用
path.isAbsolute()和白名单目录做守卫,防止路径遍历 - 敏感操作走主进程 + IPC:如启动子进程、读写用户目录等,应在主进程中完成逻辑,仅返回结果给前端
原生插件(C++/Rust)的特殊处理
这类模块需额外构建步骤才能在 Electron 中运行:
- 安装
@electron/rebuild,每次升级 Electron 后运行npx electron-rebuild - 或设置环境变量后重装:
NODE_ENV=production npm_config_runtime=electron npm_config_target=3.1.0 npm install - 确保编译工具链匹配(macOS 用 Xcode CLI,Windows 用 VS Build Tools,Linux 用 GCC/Clang)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











