建议点击 查看原文 查看最新内容。
原文链接: https://typonotes.com/posts/2025/05/16/os-root-in-go124/
os.Root
可以锁定工作目录。 使用户无法打开目录外的文件,例如 ../../../etc/passwd
。 可以算一种 安全保护
最重要的是 强制约束用户, 限制用户行为, 检查计划外的使用逻辑 。 免得和煞笔瞎掰扯, 浪费时间。
root, _ := os.OpenRoot(basedir)
锁定工作目录root.Xzzzz()
展开root.OpenFile(path)
在打开文件之前, 会判断 文件路径 的合法性。 basedir 之外的路径拒绝访问。path
可以是绝对路径。path
也可以是基于 basedir
的相对路径。invalid-file-path.png
root.ReadFile(path)
这样的快捷 API。 还是需要分成 root.OpenFile
和 io.ReadAll
。 有点不习惯了。所有方法如下, https://pkg.go.dev/os@master#Root
package main
import (
"bytes"
"io"
"os"
)
// demo
var configdir = "/tmp/go-demo-os-root/configdir"
func main() {
_ = os.MkdirAll(configdir, 0755)
// os.OpenRoot 打开并锁定目录
root, err := os.OpenRoot(configdir)
if err != nil {
panic(err)
}
// root.OpenFile 打开文件, 可以是基于 root 的相对路径
f, err := root.OpenFile("../main.go", os.O_RDONLY, 0644)
if err != nil {
panic(err)
}
defer f.Close()
// 不支持 os.ReadFile 这样的快捷方式。
// 使用 io 读取文件
_, err = io.ReadAll(f)
if err != nil {
panic(err)
}
// ... omit
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有