构建 Tauri 应用时,安全不是“事后打补丁”,而是在配置阶段就能固化的基线。以下清单覆盖了从开发到分发的核心安全项,每一项都直接对应一个可能被利用的攻击面。你可以在项目初始化或发布前逐项核对。
1. 启用上下文隔离(Context Isolation)
- 配置:在
tauri.conf.json中,确保tauri > security > csp未设置过于宽松的策略,同时检查tauri > allowlist没有全局开启危险 API。 - 作用:将前端 JavaScript 运行环境与 Tauri 的 IPC 通道完全隔离,防止恶意脚本直接调用后端命令。
- 检查:确认
tauri.conf.json中没有设置"dangerousRemoteDomainIpcAccess": true(除非有绝对必要且了解风险)。
2. 最小化权限白名单(Allowlist)
- 原则:默认所有系统接口都是禁用的,只开放应用真正需要的功能。
- 具体项:
fs:仅允许读取/写入指定目录,避免使用scope: ["**"]。shell:如果不需要打开外部程序,完全关闭;若需要,使用精确的命令白名单。http:限定能访问的域名及端口,禁止访问内网敏感地址。clipboard、dialog、notification等:按需开启,不给多余权限。- 为什么重要:即使前端被注入恶意代码,攻击者也无法调用未授权的系统能力。
3. 内容安全策略(CSP)
- 配置位置:
tauri.conf.json的tauri > security > csp字段。 - 推荐基线:
default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'
- 关键点:
- 禁止
script-src 'unsafe-eval'(除非前端框架强制需要)。 - 限制
connect-src为你的 API 域名和白名单 WebSocket 地址。 - 避免使用
*通配符或data:、blob:源。 - 效果:在浏览器层面阻止 XSS 攻击执行外部脚本或与恶意域名通信。
4. 禁用危险 API 与调试接口
- 检查:
- 生产构建时,确保
devtools功能禁用(tauri > allowlist > devtools设为false)。 - 移除或禁用
tauri-plugin-*中不需要的插件,尤其是fs、process、shell若未使用必须关闭。 - 附加:确保 Rust 后端不暴露可以执行任意系统命令的自定义命令(如
std::process::Command直接由前端传参调用)。
5. 外部链接与导航控制
- 问题:WebView 中可能通过
window.open或target="_blank"打开外部链接,导致安全上下文泄露。 - 处理:
- 使用 Tauri 的
on_navigation回调拦截所有导航请求,仅允许应用内路由或受信任的域名。 - 对于必须打开的外部链接,调用
shell.open(受 allowlist 控制)在系统默认浏览器中打开,而不是在 WebView 中加载。
6. 自定义协议的安全处理
- 风险:如果在页面上注册了自定义协议(如
tauri://),可能被恶意页面利用。 - 配置:确保自定义协议仅用于 IPC,不在前端代码中动态构造或从用户输入拼接待执行路径。
- 底线:不要用自定义协议读取或执行本地任意文件。
7. 应用更新签名验证
- 要求:对于生产环境分发,必须启用更新包的签名校验。
- Tauri 内置的 updater 插件:要求所有更新包都有签名,且公钥硬编码在应用中,防止中间人攻击或替换更新。
- 动作:检查
tauri.conf.json中updater.publicKey已正确配置,endpoints使用 HTTPS。
8. 资源与文件系统加固
- 生产二进制:确保 Rust 编译时开启最高优化(
opt-level = "s"或"z")的同时,不要开启debug断言或符号导出。 - 敏感文件:请勿将
.env、私钥、证书等文件打包进最终安装包。使用环境变量或运行时注入。 - WebView 存储:如果使用
localStorage或 IndexedDB 存储敏感数据,记得在退出时清理,或采用加密存储(如通过 Rust 命令加密后写入文件)。
9. 最小化依赖与供应链安全
- Rust 依赖:定期
cargo audit检查已知漏洞,移除未使用的 crate。 - 前端依赖:用
npm audit或类似工具审查,避免引入有漏洞的 npm 包。 - 构建环境:在 CI 中使用固定版本的依赖,启用锁定文件校验,防止供应链投毒。
10. 日志与错误处理
- 原则:生产环境禁止在控制台或日志中输出堆栈信息、敏感路径或配置。
- 做法:使用 Tauri 的日志插件,仅在发生恢复性错误时记录关键信息,并将日志文件放在受限权限目录。
- 检查:前端代码中不应当有
console.log打印 token 或用户数据(上线时通过drop_console等工具移除)。
清单使用方法:每次发版前,用这份列表做一次5分钟的“安全巡检”,可以拦截绝大多数由配置不当引发的漏洞。Tauri 设计的默认值已经非常安全,你只需确保自己没有“犯懒”全部打开即可。