您的位置:首页 >Golang解压zip文件到指定目录方法
发布于2026-04-14 阅读(0)
扫一扫,手机访问
使用 archive/zip 解压 zip 文件前必须检查 io.ErrUnexpectedEOF,严格过滤路径遍历(如 ../),手动处理 GBK 中文文件名编码,并区分处理 symlink 等特殊文件类型,否则易致安全漏洞或静默失败。

archive/zip 打开 zip 文件前必须检查 io.ErrUnexpectedEOF直接 zip.OpenReader 读损坏或不完整的 zip 包会 panic 或静默失败,常见错误是 zip: not a valid zip file 或更隐蔽的 unexpected EOF。这不是代码写错了,而是 zip 流没读完就被关闭了。
实操建议:
os.Stat 确认文件存在且大小 > 0zipReader.Close(),但别在 defer 里忽略错误 —— Close() 可能返回 io.ErrUnexpectedEOF,说明解压中途出问题io.LimitReader 或完整缓存再解析,archive/zip 不支持边读边解../../../etc/passwd)必须手动过滤Go 标准库 archive/zip 不做路径安全校验。攻击者构造含 ../ 的文件名,filepath.Join(dst, f.Name) 会直接写到任意目录,这是线上高危风险。
实操建议:
zip.File.Header.Name 调用 strings.HasPrefix(f.Name, "..") || strings.Contains(f.Name, "../") 判断filepath.Clean(f.Name) 后比对是否仍以 ".." 开头,或是否包含 filepath.Separator 之外的非法路径分隔符(如 Windows 下的 \)filepath.Abs() —— 它在某些情况下会绕过校验os.ModeSymlink 和 os.ModeDevice 权限位在解压时会被忽略zip 文件里可以存 symlink、device node 等特殊文件,但 Go 的 os.WriteFile 和 ioutil.WriteFile(已弃用)无法还原这些类型。直接写入会导致权限位丢失,甚至创建空文件。
实操建议:
f.IsDir() 和 f.Mode() & os.ModeSymlink != 0,对 symlink 单独用 os.Symlink(f.Name, dstPath)os.ModeDevice、os.ModeNamedPipe 等非普通文件(除非你明确需要支持)os.MkdirAll,且传入 f.Mode() —— 注意 zip 中目录权限常为 0o40755,不是 0o755Windows 上用资源管理器或旧版压缩软件打的 zip,文件名编码是 GBK(或 GB18030),但 archive/zip 总按 UTF-8 解码 Header.Name,结果就是一堆 .txt。
实操建议:
golang.org/x/text/encoding/simplifiedchinese 手动 decode:decoder := simplifiedchinese.GBK.NewDecoder() name, _ = decoder.String(f.Name)
f.Name 和 f.Comment 做,别碰 f.Extra 或内容流上一篇:圆通快递单号查询官网入口
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9