iOS第八十六篇:Electron桌面端开发
IPCNode.js API受限访问主进程 Main Process渲染进程 Renderer Process系统资源安全原则:2. 预加载脚本安全示例3. 渲染进程安全策略三、关键安全防护措施1. 输入验证与消毒2. 安全通信协议协议类型使用场景安全措施HTTPS所有外部请求强制使用TLS 1.3WSSWebSocket通信证书固定File协议本地资源加载限制访问范围3. 敏感操作防护四、代码保
·
Electron 桌面应用安全加固与开发指南
一、Electron 安全架构基础
进程模型安全
安全原则:
- 最小特权原则:渲染进程默认禁用 Node.js 集成
- 沙箱隔离:渲染进程在独立沙箱环境运行
- 上下文隔离:阻止渲染进程直接访问主进程 API
二、核心安全配置
1. 主进程安全配置
const { app, BrowserWindow } = require('electron')
function createWindow() {
const win = new BrowserWindow({
webPreferences: {
nodeIntegration: false, // 禁用Node.js集成
contextIsolation: true, // 启用上下文隔离
sandbox: true, // 启用Chromium沙箱
webSecurity: true, // 启用同源策略
enableRemoteModule: false, // 禁用remote模块
preload: path.join(__dirname, 'preload.js') // 安全预加载脚本
}
})
// 加载应用
win.loadFile('index.html')
// 生产环境禁用开发者工具
if (process.env.NODE_ENV === 'production') {
win.webContents.closeDevTools()
}
}
app.whenReady().then(createWindow)
2. 预加载脚本安全示例
// preload.js
const { contextBridge, ipcRenderer } = require('electron')
// 安全暴露有限API到渲染进程
contextBridge.exposeInMainWorld('api', {
send: (channel, data) => {
// 限制允许的IPC通道
const validChannels = ['save-data', 'get-config']
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data)
}
},
receive: (channel, func) => {
const validChannels = ['data-saved', 'config-loaded']
if (validChannels.includes(channel)) {
ipcRenderer.on(channel, (event, ...args) => func(...args))
}
}
})
3. 渲染进程安全策略
<!-- 在HTML头部添加严格CSP -->
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self' 'wasm-unsafe-eval';
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
font-src 'self';
connect-src 'self' https://api.example.com;
frame-src 'none';
object-src 'none';
">
三、关键安全防护措施
1. 输入验证与消毒
// 主进程 - 文件路径验证
ipcMain.handle('read-file', (event, filePath) => {
// 防止路径遍历攻击
const normalizedPath = path.normalize(filePath)
if (!normalizedPath.startsWith(app.getPath('userData'))) {
throw new Error('非法文件路径')
}
return fs.readFileSync(normalizedPath, 'utf-8')
})
// 渲染进程 - DOM消毒
const DOMPurify = require('dompurify')
document.getElementById('content').innerHTML =
DOMPurify.sanitize(userInput, { FORBID_TAGS: ['style', 'script'] })
2. 安全通信协议
协议类型 | 使用场景 | 安全措施 |
---|---|---|
HTTPS | 所有外部请求 | 强制使用TLS 1.3 |
WSS | WebSocket通信 | 证书固定 |
File协议 | 本地资源加载 | 限制访问范围 |
// 证书固定示例
app.on('ready', () => {
session.defaultSession.setCertificateVerifyProc((request, callback) => {
const { hostname } = request
const validCerts = {
'api.example.com': [
'sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='
]
}
if (validCerts[hostname]?.includes(request.certificate.fingerprint)) {
callback(0) // 验证通过
} else {
callback(-3) // 验证失败
}
})
})
3. 敏感操作防护
// 安全密钥存储
const Store = require('secure-electron-store').default
const store = new Store()
// 存储密钥
store.setSecure('apiKey', 'supersecret123')
// 访问密钥
ipcMain.handle('get-api-key', () => {
return store.getSecure('apiKey')
})
四、代码保护与加固
1. 代码混淆与保护
工具 | 功能 | 使用方式 |
---|---|---|
bytenode | 编译为V8字节码 | require('bytenode') |
javascript-obfuscator | JS代码混淆 | Webpack插件集成 |
electron-builder | 二进制加壳 | asar打包+资源加密 |
// 使用bytenode编译关键模块
const bytenode = require('bytenode')
const compiledPath = path.join(__dirname, 'module.jsc')
if (!fs.existsSync(compiledPath)) {
bytenode.compileFile({
filename: 'module.js',
output: compiledPath
})
}
require(compiledPath)
2. 反调试技术
// 主进程反调试
setInterval(() => {
try {
process._debugProcess(process.pid)
} catch (e) {
app.quit() // 检测到调试器时退出
}
}, 5000)
// 渲染进程反调试
if (process.env.NODE_ENV === 'production') {
const Devtron = require('devtron')
Devtron.uninstall()
// 禁用F12和右键菜单
document.addEventListener('keydown', (e) => {
if (e.key === 'F12' || (e.ctrlKey && e.shiftKey && e.key === 'I')) {
e.preventDefault()
}
})
document.addEventListener('contextmenu', (e) => {
e.preventDefault()
})
}
五、安全更新与分发
1. 自动更新流程
2. 代码签名配置
// electron-builder.json
{
"appId": "com.example.app",
"productName": "安全应用",
"copyright": "Copyright © 2023",
"build": {
"asar": true,
"asarUnpack": "**/*.node",
"win": {
"target": "nsis",
"certificateFile": "./certs/cert.pfx",
"certificatePassword": "password",
"verifyUpdateCodeSignature": true
},
"mac": {
"target": "dmg",
"identity": "Developer ID Application: Company (XXXXXXXXXX)",
"hardenedRuntime": true,
"gatekeeperAssess": false
},
"linux": {
"target": "AppImage"
}
}
}
六、安全开发最佳实践
1. 安全依赖管理
# 定期扫描漏洞
npm audit --production
npx electron-security-audit
# 使用安全依赖版本
npm install --save-exact electron@24.8.3
2. 安全编码规范
- 永远不要使用
innerHTML
插入用户输入 - 禁用
eval()
、new Function()
等动态执行 - 所有 IPC 通信需验证来源
// 验证IPC来源
ipcMain.handle('sensitive-action', (event, ...args) => {
if (event.senderFrame !== event.sender.mainFrame) {
return null // 拒绝跨frame请求
}
// 验证发送方URL
const url = new URL(event.sender.getURL())
if (url.protocol !== 'file:') {
return null // 只允许本地文件请求
}
// 执行操作
})
3. 安全审计工具
工具 | 用途 | 安装方式 |
---|---|---|
Electronegativity | Electron配置审计 | npm install -g @doyensec/electronegativity |
OWASP ZAP | 动态应用扫描 | 独立安装 |
Burp Suite | 高级渗透测试 | 商业工具 |
七、应急响应方案
1. 漏洞响应流程
2. 事件日志监控
// 安全事件日志
const { net } = require('electron')
const securityLog = []
function logSecurityEvent(event, details) {
const entry = {
timestamp: new Date(),
event,
details,
user: require('os').userInfo().username,
appVersion: app.getVersion()
}
securityLog.push(entry)
// 上报到安全服务器
if (process.env.NODE_ENV === 'production') {
const request = net.request({
method: 'POST',
url: 'https://security.example.com/log',
useSessionCookies: false
})
request.setHeader('Content-Type', 'application/json')
request.write(JSON.stringify(entry))
request.end()
}
}
// 记录敏感操作
logSecurityEvent('FILE_WRITE', { path: filePath, size: data.length })
八、推荐安全工具链
类别 | 工具 | 功能 |
---|---|---|
框架安全 | electron-hardener | 自动加固配置 |
依赖安全 | npm audit | 漏洞扫描 |
代码保护 | bytenode | V8字节码编译 |
分发安全 | electron-builder | 签名打包 |
动态分析 | Electronegativity | 配置审计 |
静态分析 | Semgrep | 代码扫描 |
# 安全开发环境初始化
npx create-secure-electron-app my-app --template typescript
cd my-app
npm install --save-dev @doyensec/electronegativity
npm run security-audit
最佳实践总结:
- 始终启用上下文隔离和沙箱
- 严格限制渲染进程权限
- 所有用户输入视为恶意
- 保持Electron和依赖项最新
- 使用自动化安全工具链
- 实施代码签名和更新验证
- 建立安全事件监控体系
通过实施这些措施,可显著提升Electron应用的安全性,有效防御XSS、RCE等常见攻击。建议每季度进行专业安全审计,持续改进安全防护体系。
更多推荐
所有评论(0)