如何在Electron应用中禁用网络功能?
Electron离线应用禁用网络连接的实现方案
该需求完全可以实现,可通过以下多层级的配置完成防护,避免应用发起任何对外网络请求:
1. 主进程全局拦截所有网络请求
通过Electron的webRequestAPI拦截所有会话的网络请求,仅放行本地文件协议的资源加载,其余全部阻断:
const { app, session } = require('electron') const path = require('path') app.whenReady().then(() => { session.defaultSession.webRequest.onBeforeRequest((details, callback) => { // 仅允许本地静态资源加载,其他所有网络请求直接取消 if (details.url.startsWith('file://')) { callback({ cancel: false }) } else { callback({ cancel: true }) } }) })
2. 禁用所有网络相关权限与API
2.1 全局拒绝权限请求
关闭所有非必要的权限申请入口,避免地理位置、媒体设备等需要联网的权限被调用:
session.defaultSession.setPermissionRequestHandler((webContents, permission, callback) => { // 所有权限默认拒绝,如有本地需要的权限可单独加白名单放行 callback(false) })
2.2 渲染进程层面禁用网络API
通过preload脚本删除浏览器原生提供的所有网络调用接口,防止渲染层代码发起请求:
preload.js文件内容:
window.addEventListener('DOMContentLoaded', () => { // 批量删除网络相关API delete window.fetch delete window.XMLHttpRequest delete window.WebSocket delete window.EventSource delete navigator.sendBeacon delete navigator.geolocation })
创建窗口时正确配置webPreferences,避免绕过限制:
const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js'), // 关闭渲染进程的Node权限,防止直接调用Node网络模块 nodeIntegration: false, contextIsolation: true, enableRemoteModule: false, // 禁用webview标签,避免绕过主进程拦截规则 webviewTag: false } })
3. 额外加固措施
- 禁用Electron内置的自动更新模块
autoUpdater,移除所有需要联网的内置功能 - 打包前校验所有第三方依赖,排除自带联网逻辑的依赖包
- 可配合系统级防火墙规则,给打包后的应用程序添加禁止联网的全局规则,做双重防护
内容的提问来源于stack exchange,提问作者sunknudsen
相关产品推荐
相关产品推荐

