安全模型
DeLive 遵循桌面 Electron 应用的纵深防御原则。
上下文隔离
渲染进程以严格安全设置运行:
contextIsolation: true
nodeIntegration: false渲染进程无法直接访问 Node.js API。与主进程的所有通信通过 contextBridge 暴露的 electronAPI 对象。
可信 IPC
敏感 IPC 处理器通过 assertTrustedSender 验证调用者:
registerTrustedWindow(provider)注册窗口获取器- 每次敏感 IPC 调用时,
isTrustedSender(event)检查event.sender.id是否匹配已注册窗口 - 仅 主窗口 和 字幕窗口 被信任
受保护操作: safeStorage 读写、诊断导出、开机自启切换、文件选择器、路径存在检查、更新下载/安装、本地 Runtime 管理。
内容安全策略
CSP 在 Electron 层通过 session.webRequest.onHeadersReceived 注入:
script-src仅在开发模式下包含'unsafe-eval'connect-src仅允许必需的端点(localhost、Provider API)
导航守卫
主窗口阻止导航到意外 URL。允许的源:
http://localhost:5173(开发服务器)file:(生产打包应用)devtools:(开发工具)
外部 URL 通过 shell.openExternal 打开。
路径白名单
文件操作限制在安全目录:
userData(Electron 应用数据)home、desktop、downloads、documentstemp
超出这些根目录的文件路径操作被拒绝。
密钥存储
API Key 使用 Electron 的 safeStorage API 加密:
safeStorage.encryptString(value)生成加密缓冲区- 缓冲区写入
userData/safe-store/ss_<key>文件 safeStorage.decryptString(buffer)获取明文
使用 OS 密钥链(macOS Keychain、Windows Credential Manager、Linux Secret Service)。
Open API 安全
本地 REST API 和 WebSocket 有多层安全保护:
| 层 | 行为 |
|---|---|
| 默认禁用 | 显式启用前 API 返回 403 |
| 必填 Bearer Token | 所有请求必须携带令牌;令牌为空时拒绝所有请求 |
| 仅 localhost | 服务器只监听 127.0.0.1(及 ::1);网络不可访问 |
| Host / Origin 校验 | 非本机 Host 头返回 403(防 DNS rebinding);WebSocket 路由拒绝网页来源 |
| 只读 | 无修改端点;会话无法通过 API 修改 |
INFO
本机上任何拿到令牌的进程都能读取转录数据,请像对待密码一样保管令牌。
无 API 录制控制
getDisplayMedia() 需要明确的用户交互(屏幕/窗口选择器)。DeLive 有意不通过 API 暴露 start_recording 或 stop_recording。这是安全正向决策 — 外部进程无法静默启动音频捕获。
诊断卫生
诊断导出(export-diagnostics IPC)在写入 JSON 包前脱敏看起来像密钥的字段(API Key、Token)。