提问人:Finlay Weber 提问时间:10/22/2023 最后编辑:John KugelmanFinlay Weber 更新时间:10/22/2023 访问量:78
如何修复存档中的文件在从我的端点下载时权限被拒绝?
How to fix files within archive having permission denied when downloaded from my endpoint?
问:
我正在使用 Actix Web 和 Tokio Tar 实现一个端点来下载存档文件。
存档生成的代码灵感来自此处示例中所示的代码。现转载如下:
let mut ar = Builder::new(Cursor::new(vec![]));
for (path, file) in files {
let mut header = Header::new_gnu();
header.set_size(file.len() as u64);
header.set_cksum();
ar.append_data(&mut header, path, Cursor::new(file)).await?;
}
let ar_data = ar.into_inner().await?;
Ok(HttpResponse::Ok()
.append_header(("Content-Disposition", "attachment; filename=\"archive.tar\""))
.body(ar_data.into_inner()))
当我访问端点时,我可以下载存档,也可以解压缩它。现在的问题是,存档中的所有文件似乎都具有错误的权限。我无法打开它。
当我检查权限时,这是我得到的:
ls -l /Users/me/Downloads/archive
total 32
---------- 1 me staff 83 Jan 1 1970 one.md
---------- 1 me staff 2267 Jan 1 1970 two.png
---------- 1 me staff 4708 Jan 1 1970 three.svg
drwxr-xr-x@ 3 me staff 96 Oct 21 19:37 src
当我手动更新权限以允许读/写时,我可以打开该文件。
问题是,为什么使用此权限生成存档?更重要的是,如何使端点生成具有正确权限的存档,以允许用户能够读取和写入它?
答:
您的代码不是从磁盘上的文件创建存档。相反,它从磁盘读取文件,然后使用该文件的读取器为要存档的文件提供字节。换言之,存档库永远不会看到原始文件元数据(包括权限),因此不可能复制原始权限。std::io::Read
因此,您需要以文件权限是您想要的方式创建存档。我不是这方面的专家,但快速浏览一下文档表明,您可能想要使用或显式构建具有所需权限的标头
(它有很多设置文件元数据的方法)。tokio-tar
Builder::append_file
一般来说,习惯于阅读您正在使用的板条箱的文档是个好主意。看看有哪些功能和类型可用,四处阅读,你可能会发现一些为你指明正确方向的东西。
通常,您应该非常明确地说明通过网络发送数据的存档的权限。文件权限可能是一种攻击媒介。
例如,最近在 Cargo 中修复了一个 CVE,其中 Cargo 在不检查权限的情况下解压缩了 crate 存档,这意味着 crate 作者可以创建一个 crate,其中所有文件都是所有用户的 rwx,这意味着恶意用户可以通过覆盖缓存下载的 crate 的源代码来攻击同一台机器上的另一个用户。小心。
评论