Class ZipUtils

java.lang.Object
tech.riemann.nif.utils.ZipUtils

public class ZipUtils extends Object
ZIP工具类,提供文件的压缩和解压缩功能

H18/M44: 解压侧具备安全防护——

  • 路径穿越(Zip Slip):拒绝绝对路径与 ../ 逃逸条目(canonical 前缀校验)
  • 解压炸弹(ZIP bomb):条目数、单文件大小、解压总大小上限(默认 1024 条 / 100MB 单文件 / 1GB 总量)
Author:
Kerbores(kerbores@riemann.tech)
  • Constructor Details

    • ZipUtils

      public ZipUtils()
  • Method Details

    • zipFiles

      public static void zipFiles(String source, String dest)
      压缩文件或目录
      Parameters:
      source - 源文件路径(单个文件或多层目录)
      dest - 目标ZIP文件路径
    • unzipFile

      public static void unzipFile(String zipPath, String descDir) throws IOException
      解压ZIP文件
      Parameters:
      zipPath - ZIP文件路径
      descDir - 解压目标目录
      Throws:
      IOException - 当解压过程中发生IO错误时抛出
    • unzipWithStream

      public static void unzipWithStream(InputStream inputStream, String descDir)
      使用流解压ZIP文件 该方法通过输入流读取ZIP文件,并将其内容解压到指定的目录中

      H18/M44: 使用默认安全限制——条目数 1024、单文件 100MB、总大小 1GB

      Parameters:
      inputStream - 输入流,用于读取ZIP文件的内容
      descDir - 解压目标目录,ZIP文件的内容将解压到这个目录下
    • unzipWithStream

      public static void unzipWithStream(InputStream inputStream, String descDir, int maxEntries, long maxSingleFileSize, long maxTotalSize)
      使用流解压ZIP文件(带解压炸弹防护限制)

      H18: 拒绝路径穿越——绝对路径条目与 ../ 逃逸条目直接抛异常; canonical 前缀校验同时拦截已存在符号链接的逃逸

      M44: 解压炸弹防护——条目数、单文件声明大小、解压总大小超限直接抛异常 (写入累计计数为硬防线,zip 头声明大小仅作粗筛)

      Parameters:
      inputStream - 输入流,用于读取ZIP文件的内容
      descDir - 解压目标目录,ZIP文件的内容将解压到这个目录下
      maxEntries - 最大条目数(文件条目),超限视为解压炸弹
      maxSingleFileSize - 单文件最大解压大小(字节)
      maxTotalSize - 解压总大小上限(字节)
    • unzipWithStream

      public static void unzipWithStream(InputStream inputStream, String descDir, Charset charset, int maxEntries, long maxSingleFileSize, long maxTotalSize)
      使用流解压ZIP文件(带解压炸弹防护限制 + 可配置文件名编码)

      H18: 拒绝路径穿越——绝对路径条目与 ../ 逃逸条目直接抛异常; canonical 前缀校验同时拦截已存在符号链接的逃逸

      M44: 解压炸弹防护——条目数、单文件声明大小、解压总大小超限直接抛异常 (写入累计计数为硬防线,zip 头声明大小仅作粗筛)

      M46: 文件名编码可配置(默认 UTF-8;旧系统 GBK 生成的 zip 传 Charset.forName("GBK"))

      Parameters:
      inputStream - 输入流,用于读取ZIP文件的内容
      descDir - 解压目标目录,ZIP文件的内容将解压到这个目录下
      charset - 文件名编码
      maxEntries - 最大条目数(文件条目),超限视为解压炸弹
      maxSingleFileSize - 单文件最大解压大小(字节)
      maxTotalSize - 解压总大小上限(字节)