在生产环境中禁用 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。
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. 环境混淆:开发环境为了方便临时关闭,发布前忘记改回,导致生产版本裸奔。建议使用环境变量控制配置。