728x90
Java poi library를 사용해서 powerpoint 를 열고 수정하고 저장하는 내용의 프로그램을 만드는 중에 실행 시 아래와 같은 에러가 발생했다.
java.io.IOException: Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data.
This may indicate that the file is used to inflate memory usage and thus could pose a security risk.
You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit.
Uncompressed size: 487032, Raw/compressed size: 4869, ratio: 0.009997
Limits: MIN_INFLATE_RATIO: 0.010000, Entry: ppt/slideMasters/slideMaster1.xml
at org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.checkThreshold(ZipArchiveThresholdInputStream.java:132)
at org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.read(ZipArchiveThresholdInputStream.java:82)
at org.apache.poi.util.IOUtils.toByteArray(IOUtils.java:182)
at org.apache.poi.util.IOUtils.toByteArray(IOUtils.java:149)
at org.apache.poi.openxml4j.util.ZipArchiveFakeEntry.<init>(ZipArchiveFakeEntry.java:47)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:53)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:106)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:307)
at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:47)
at org.apache.poi.xslf.usermodel.XMLSlideShow.<init>(XMLSlideShow.java:110)
at ConvertAISVendorPpt.pptConvertSelectModelAndProcessVMWeb(ConvertAISVendorPpt.java:1649)
at ConvertAISVendorPpt.main(ConvertAISVendorPpt.java:90)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:61)
검색을 해보고 GPT에게도 물어보니, 압축파일 관련해서 압축파일이 압축해제된 파일과 비교하여 비율이 100배 이상 안되도록 제한이 걸려있다고 한다.
ratio: 0.01인데 현재 ratio가 0.009997로 그 이하이므로 에러를 뱉어내는 거라고 한다.
그래서 해결방법은 여러가지가 있는데 아예 ratio 기준을 지워버리는 방법은 아래처럼 소스에 넣어주면 된다.
ZipSecureFile.setMinInflateRatio(-1.0);
그런데 이거는 좀 위험할 수 있으므로 나는 비율기준을 좀 줄여보기로 했다.
아래와 같이 파일을 사용하기 전에 선언해주면 해결이 된다.
// 압축 비율을 더 낮은 값으로 설정 (예: 0.0001)
ZipSecureFile.setMinInflateRatio(0.0001);
나는 ZipSecureFile 요거를 사용한 적이 없는데 왜 에러가 날까 싶었는데, 검색해보니 ppt, excel 등의 파일이 압축파일 형태라고 한다. 아래 GPT의 대답을 추가해놔야지.
ZipSecureFile은 Apache POI에서 OOXML 파일(.pptx, .xlsx, .docx 등)과 같은 압축된 파일 형식을 처리할 때 내부적으로 사용되는 클래스입니다. 따라서 사용자가 직접 ZipSecureFile을 사용하지 않더라도, Apache POI 라이브러리가 이러한 파일을 읽거나 쓸 때 내부적으로 ZipSecureFile을 사용하여 안전성을 보장합니다.
Apache POI와 ZipSecureFile
Apache POI 라이브러리는 OpenXML 파일 형식(예: .pptx, .xlsx, .docx)을 처리할 때, Java의 java.util.zip 패키지와 유사한 내부 압축 처리 메커니즘을 사용합니다. 특히 .pptx 파일은 실제로 여러 개의 XML 파일과 리소스 파일(이미지, 오디오 등)을 압축한 ZIP 아카이브 형식입니다.
ZipSecureFile 클래스는 이러한 압축 파일을 안전하게 처리하기 위해 POI가 사용하는 유틸리티 클래스입니다. 이 클래스는 ZIP 파일의 압축 비율을 확인하고, 특정 조건(압축 비율이 너무 낮은 경우)에서 파일을 "zip bomb"으로 간주하여 읽기를 중지합니다. 이는 압축 폭탄(파일이 압축된 상태에서는 작지만 압축 해제 시 매우 커져 시스템 메모리를 고갈시키는 공격)을 방지하기 위한 보안 기능입니다.
ZipSecureFile을 사용하지 않아도 오류가 발생하는 이유
Apache POI를 통해 PowerPoint 파일을 열 때, 내부적으로 ZipSecureFile을 사용하여 압축 파일을 처리하고 있습니다. 그래서 ZipSecureFile을 코드에서 직접 호출하지 않더라도, POI는 기본적으로 이 클래스의 보안 설정을 따르게 됩니다. 따라서 .pptx 파일을 열고 읽는 코드에서 압축 비율이 임계값보다 낮은 파일을 만나면 "Zip bomb detected!" 오류가 발생할 수 있습니다.
728x90
'Java > JAVA' 카테고리의 다른 글
Java poi library 3.17 에서 4.1.2로 변경 (poi 4.1.2 ver download url) (0) | 2024.08.23 |
---|---|
[JAVA-SWT] Eclipse에서 swt library추가하여 JAVA 프로젝트 생성 (0) | 2023.07.06 |