指令配置(Command Allowlist)
前端无法随意调用 Rust 函数。你必须事先在 tauri.conf.json 中,通过 tauri > allowlist(Tauri v1)或 tauri > security > allowedCommands(Tauri v2)来声明哪些指令可以被前端触发。这个“白名单”机制确保了即便前端代码被注入恶意脚本,攻击者也无法执行未授权的系统操作。
典型配置示例(Tauri v2 风格):
{
"tauri": {
"security": {
"allowedCommands": [
"read_file",
"write_file",
"open_dialog"
]
}
}
}
在 Rust 侧,使用 #[tauri::command] 定义函数,其函数名自动成为指令名。如果某个命令未出现在允许列表中,前端调用时会直接收到错误,Rust 端根本不会执行。你还可以在命令实现中对参数做二次校验,但这一步已经是额外保险了。
脚本限制(Content Security Policy)
Tauri 允许(也强烈建议)你通过 Content Security Policy(CSP)来限制 WebView 中的脚本行为。你可以在 tauri.conf.json 的 tauri > security > csp 字段中设置 CSP 字符串,也可以自定义 HTML 中的 <meta> 标签。
最严格的策略是仅允许同一个源下的脚本,并禁止 eval、内联脚本和从外部 CDN 加载 JavaScript:
{
"tauri": {
"security": {
"csp": "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'"
}
}
}
这样设置后:
- 任何
<script src="https://evil.com/x.js">都会被拦截。 - 内联的
onclick="..."或javascript:伪协议被禁用(除非你明确添加'unsafe-hashes'或使用'unsafe-inline')。 - 你仍然可以通过
script-src 'self'加载同源的前端打包产物。
即使你需要在 CSP 中放行一些合法资源(比如用于埋点的远程脚本),也请尽量缩小范围,例如 script-src 'self' https://trusted-analytics.com。
资源加载限制(Asset & Resource Restrictions)
Tauri 使用自定义的协议(如 tauri:// 或 asset://)来加载前端资源,而不是通过 file:// 协议,这避免了 file:// 域下的跨源风险。但如果你不小心,前端代码可能通过 fetch、XMLHttpRequest 或 <img> 标签去请求本地文件或任意远程地址,从而泄露信息。
你需要结合 CSP 和 Tauri 的 allowlist 来收紧网络访问。
- 只允许加载本地资源
在 CSP 中设置 default-src 'self',并不为 img、media 等开启远程源。这样所有外部图片、视频请求都会被浏览器拦截。
- 配置 allowlist 中的网络访问
在 tauri.conf.json 的 tauri > allowlist > http(v1)或通过权限系统(v2)明确哪些域名可以被前端直接请求。Tauri 的网络拦截器会阻止任何不在许可列表中的 fetch/XHR 调用,即使是 JavaScript 发起的也同样被拦截。
// Tauri v1 示例
{
"tauri": {
"allowlist": {
"http": {
"scope": ["https://api.yourdomain.com/*"]
}
}
}
}
- 限制文件访问范围
当你通过 Rust 命令来读写文件时,可以约定只允许操作应用专属数据目录(app_data_dir),或者强制在前端传入的路径上做正则校验,杜绝路径遍历攻击。这并不是“资源加载限制”的直接配置,但同样是阻止前端越权访问本地资源的关键实践。
一句话总结:指令配置让前端只能调用你授权的 Rust 函数;脚本限制通过 CSP 挡住了未经许可的脚本执行;资源加载限制则严格管控了网络和本地文件的访问范围。这三者叠加,构成了 Tauri 应用前端沙箱的“铜墙铁壁”,即使 UI 层被攻破,也很难扩散到宿主系统。