如何在Rust端校验文件路径是否符合tauri.config的allowList范围
在Tauri后端校验文件路径是否符合allowList权限范围
要在Tauri后端使用OpenOptions操作文件前校验路径是否符合tauri.config.json中allowList.fs.scope的限制,你可以通过FsScope结构体完成校验,具体步骤如下:
核心步骤
- 解析目标路径:将带变量或相对路径的输入转换为绝对路径,确保
FsScope能正确识别。 - 获取FsScope实例:从App或Window上下文直接获取配置好的权限范围。
- 执行路径校验:调用
FsScope::is_allowed方法检查路径是否在允许范围内,并匹配对应的读写权限。
代码实现示例
假设你有一个后端命令用于写入YAML配置文件,完整实现如下:
use tauri::{api::path::resolve_path, fs::{FsPermission, FsScope}, AppHandle, CommandError}; use std::path::PathBuf; #[tauri::command] async fn write_yaml_config(app_handle: AppHandle, target_path: String, yaml_content: String) -> Result<(), CommandError> { // 1. 解析路径:替换$HOME等变量,转换为绝对路径 let resolved_path: PathBuf = resolve_path( &app_handle.config(), &app_handle.package_info(), target_path, true, // 允许扩展环境变量 ).map_err(|e| CommandError::from(e.to_string()))?; // 2. 获取配置好的文件权限范围 let fs_scope: &FsScope = app_handle.fs_scope(); // 3. 校验路径是否允许写入(读操作则用FsPermission::Read) if !fs_scope.is_allowed(&resolved_path, FsPermission::Write) { return Err(CommandError::from(format!( "路径 {} 不在允许的操作范围内", resolved_path.display() ))); } // 4. 执行文件写入操作 std::fs::write(&resolved_path, yaml_content).map_err(|e| CommandError::from(e.to_string()))?; Ok(()) }
关键细节说明
- 路径解析:
resolve_path会自动处理tauri.config中定义的路径变量(如$HOME、$APPDATA)以及相对路径,返回标准的绝对路径,这是is_allowed方法的必要前提。 - FsScope获取:
AppHandle::fs_scope()会直接加载tauri.config.json中allowList.fs.scope的配置,无需手动实例化。 - 权限匹配:
is_allowed的第二个参数需明确是Read还是Write,对应allowList.fs中开启的readFile/writeFile权限。 - 你的配置适配:针对你提供的
"$HOME/some_folder/*"范围,is_allowed会自动校验路径是否位于$HOME/some_folder目录或其子目录下。
注意事项
- 确保所有自定义文件操作都前置此校验,避免绕过Tauri的权限限制导致安全风险。
- 若使用
WindowHandle而非AppHandle,同样可以通过window_handle.fs_scope()获取相同的权限范围实例。
内容的提问来源于stack exchange,提问作者dossimus maximus
相关产品推荐
相关产品推荐

