Zipファイルの中にZipが入っているファイルがあったとします。
JavaでUnzipするにはどうしたらよいのでしょうか?
再帰を使ってunzip
Javaのプログラムでは再帰 を使ってunzipするとよいようです。
ここにあるサンプルプログラムは使えそうだ。
・https://stackoverflow.com/questions/981578/how-to-unzip-files-recursively-in-java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
static public void extractFolder(String zipFile) throws ZipException, IOException { System.out.println(zipFile); int BUFFER = 2048; File file = new File(zipFile); ZipFile zip = new ZipFile(file); String newPath = zipFile.substring(0, zipFile.length() - 4); new File(newPath).mkdir(); Enumeration zipFileEntries = zip.entries(); // Process each entry while (zipFileEntries.hasMoreElements()) { // grab a zip file entry ZipEntry entry = (ZipEntry) zipFileEntries.nextElement(); String currentEntry = entry.getName(); File destFile = new File(newPath, currentEntry); //destFile = new File(newPath, destFile.getName()); File destinationParent = destFile.getParentFile(); // create the parent directory structure if needed destinationParent.mkdirs(); if (!entry.isDirectory()) { BufferedInputStream is = new BufferedInputStream(zip .getInputStream(entry)); int currentByte; // establish buffer for writing file byte data[] = new byte[BUFFER]; // write the current file to disk FileOutputStream fos = new FileOutputStream(destFile); BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER); // read and write until last byte is encountered while ((currentByte = is.read(data, 0, BUFFER)) != -1) { dest.write(data, 0, currentByte); } dest.flush(); dest.close(); is.close(); } if (currentEntry.endsWith(".zip")) { // found a zip file, try to open extractFolder(destFile.getAbsolutePath()); } } } |
Zip Slip脆弱性
注意しないといけない点としてZip Slip脆弱性というのがある。
Zip Slipとは、Zipファイルを始めとしたアーカイブファイルの脆弱性のことです。
この脆弱性を利用すると、攻撃対象のファイルを勝手に書き換えたり置き換えたりできるようになります。
Zip Slipとは
・https://it-trend.jp/encryption/article/64-0059
・https://github.com/snyk/zip-slip-vulnerability
コメント