Electron 启用 webSecurity false 带来的安全风险有哪些

文章导读
在生产环境中禁用 webSecurity 属于高危操作,除非你完全清楚自己在加载不受信任的远程内容且无法通过后端 CORS 解决,否则应始终保持该选项为默认值 true。
📋 目录
  1. 安全配置示例
  2. 风险场景演示
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在生产环境中禁用 webSecurity 属于高危操作,除非你完全清楚自己在加载不受信任的远程内容且无法通过后端 CORS 解决,否则应始终保持该选项为默认值 true。

先说结论:webSecurity: false 会禁用 Chromium 的安全策略,导致跨域、混合内容等保护失效,极易引发 XSS 甚至远程代码执行风险。

  • 先判断:确认是否真的无法通过后端配置 CORS 或使用代理服务器解决跨域问题。
  • 优先做:生产环境务必保持 webSecurity: true,配合 contextIsolation 和 preload 脚本使用。
  • 再验证:通过开发者工具检查控制台报错和网络请求,确保没有安全策略被意外绕过。

安全配置示例

以下是推荐的安全配置模板,确保 webSecurity 保持开启,并配合其他安全选项:

const { BrowserWindow } = require('electron')
const path = require('path')

const win = new BrowserWindow({
  webPreferences: {
    webSecurity: true, // 保持默认开启,严禁设为 false
    nodeIntegration: false, // 禁用 Node 集成
    contextIsolation: true, // 启用上下文隔离
    preload: path.join(__dirname, 'preload.js') // 使用 preload 脚本暴露必要 API
  }
})

风险场景演示

当 webSecurity 被设置为 false 时,Chromium 的同源策略失效。攻击者可以利用此漏洞发起跨域请求或加载不安全内容。

场景 1:跨域数据窃取

正常情况下,浏览器禁止向不同源的接口发送携带 Cookie 的请求。禁用安全策略后,恶意脚本可直接读取用户数据:

// 攻击者注入的恶意脚本
fetch('https://internal-api.example.com/user/data', {
  credentials: 'include' // 可携带本地 Cookie
})
.then(res => res.json())
.then(data => sendToAttacker(data)) // 窃取敏感数据

场景 2:本地文件读取(配合 Node 集成漏洞)

若同时禁用了 nodeIntegration 或存在 XSS 漏洞,攻击者可能通过 file 协议读取本地文件:

// 潜在的危险操作
const fs = require('fs')
fs.readFileSync('C:/Users/Admin/.ssh/id_rsa') // 读取本地敏感文件

分步处理

1. 检查配置:搜索项目中所有 new BrowserWindow 的地方,确保没有显式设置 webSecurity: false。

Electron 启用 webSecurity false 带来的安全风险有哪些

2. 替代方案:如果是为了解决跨域,在主进程使用 session 设置代理,或让后端添加 Access-Control-Allow-Origin 头。

3. 加固通信:使用 contextBridge 暴露有限 API,避免直接暴露 ipcRenderer。

怎么验证是否生效

1. 打开应用开发者工具(F12),查看 Console 面板是否有 CORS 相关报错。若配置正确,跨域请求应被拦截。

2. 在 Network 面板检查请求头,确认没有加载不安全的 HTTP 资源到 HTTPS 页面中(Mixed Content)。

3. 尝试访问一个已知跨域的测试接口,确认请求被浏览器策略阻断。

常见坑

1. 版本差异:Electron 9.0.0 以后安全策略有所调整,但不应依赖未文档化的行为作为安全边界,某些网络请求仍可能受底层 Chromium 策略限制。

2. 连带风险:禁用该选项后,allowDisplayingInsecureContent 等参数可能自动变为 true,进一步降低安全性。

3. 环境混淆:开发环境为了方便临时关闭,发布前忘记改回,导致生产版本裸奔。建议使用环境变量控制配置。

参考来源