Skip to content

安全性:加固您的应用

与标准网站不同,Tauri 应用程序可以访问用户的操作系统。能力越大,责任越大。Tauri 的安全性基于这样一个理念:前端绝不应被完全信任。

设计应用程序最安全的方法是假设 WebView 可能会被攻破(compromised)(例如,通过恶意第三方脚本)。隔离模式(Isolation Pattern) 会拦截(intercepts)从前端发送到后端的消息,并注入一个安全桥(secure bridge)。这可以防止任意 JavaScript 直接访问 Tauri API,除非明确允许(explicitly allowed)。

尽管手动实现很复杂,但 Tauri v2 使用访问控制列表(Access Control List, ACL)系统提供了强大的默认设置来隔离各项能力。

CSP 是你抵御跨站脚本(Cross-Site Scripting, XSS)攻击的第一道防线。它限制了你的应用程序可以从哪些源加载脚本、样式和图片。在 Tauri 中,你应在 tauri.conf.json 的 security 部分进行配置。

{
"app": {
"security": {
"csp": "default-src 'self'; script-src 'self'; style-src 'self'"
}
}
}

此配置告诉 WebView:“只加载与应用程序一起打包的内容(‘self’)。不要执行外部脚本或加载远程样式。” 尽可能避免使用 'unsafe-inline' 或通配符(*)。

绝不要假设来自前端的数据是安全的。如果你有一个命令会写入文件,并且前端发送了文件名,恶意行为者(malicious actor)可能会发送 ../../../../etc/passwd。

始终在 Rust 端清理和验证输入:

#[tauri::command]
fn save_document(filename: String, content: String) -> Result<(), String> {
// BAD: File::create(filename)
// 糟糕的示例:File::create(filename)
// GOOD: Validate the filename contains no path traversals
// 好的示例:验证文件名不包含路径遍历
if filename.contains("/") || filename.contains("\\") {
return Err("Invalid filename".into());
}
// Proceed with saving...
// 继续保存...
Ok(())
}

最大的安全风险之一是允许你的应用程序导航到远程 URL(例如 https://google.com),同时注入了 Tauri API 钩子。如果该远程站点被攻破,攻击者将通过你的应用程序完全控制用户的操作系统。

黄金法则:只向你的本地内容(local content)暴露 Tauri API。如果你必须显示远程内容,请使用 <iframe> 或一个未启用 Tauri 功能的独立窗口(separate window)。

Tauri 接受独立的安全性审计(security audits)。为了保持这种安全态势(security posture),你应该查阅官方的 Tauri 安全指南。这些指南涵盖了配置权限范围(permissions scopes)(限制哪些文件系统路径可访问)以及冻结 WebView 中的对象以防止原型污染(prototype pollution)。