Tauri v1 fs 访问任意文件的 bug
在 Tauri 开发中,前端的 native 操作主要有两种实现方式:
一是直接通过 JS API,使用 Tauri 自己封装的那些方法
二是自己在 Rust 核心层进行开发,再通过 JS API 去
invoke
相关函数
第一种方式比较方便,但需要在 Tauri 配置文件中开放相关权限,作用域的和API 操作的(一方面是安全,另一方面可能是为了多平台运行考虑),比如:
{
"tauri": {
"allowlist": {
"fs": {
"scope": ["$APPDATA/databases/*"],
"all": true, // enable all FS APIs
"readFile": true,
"writeFile": true,
"readDir": true,
"copyFile": true,
"createDir": true,
"removeDir": true,
"removeFile": true,
"renameFile": true,
"exists": true
}
}
}
}
如果你正在使用 fs
模块,要通过路径去访问本地文件,那么你有三种方法去获取该文件的访问权限:
把文件路径写在
scope
中,这里只能写死,编译时就确定了,不能动态调整通过
dialog
模块弹窗,让用户先选择文件路径,此后该文件路径就会进入访问白名单选择在 Rust 核心层开发文件读写,跳过
fs
模块
关于 scope
的范围,文档是这么说的:
This module prevents path traversal, not allowing absolute paths or parent dir components (i.e. "/usr/path/to/file" or "../path/to/file" paths are not allowed). Paths accessed with this API must be relative to one of the base directories so if you need access to arbitrary filesystem paths, you must write such logic on the core layer instead.
大意是不能使用绝对路径,也不能通过 ..
访问父目录,要访问任意文件你就自己写 Rust 去弄。
但经我测试,他的 scope
范围有 bug,如果你把 scope 写满通配符,那么他的检查就失效了:
{
"tauri": {
"allowlist": {
"fs": {
"scope": ["**", "**/*", "/**/*", "*/**"],
"all": true
}
}
}
}
现在你就可以通过 JS API 访问去访问任意文件了,无需提前使用 dialog
弹窗选择文件。
Subscribe to my newsletter
Read articles from Erioifpud directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by