背景:
测试组搞了个“ZIP炸弹”传给后台,发现后台并没有识别,一度怀疑后台是不是偷懒了压根没有做安全校验。
于是,激动万分地给我提了个单。
排查:
阅读同事的代码,发现有做校验,步骤如下:
- 第一步,校验ZIP压缩包大小。
- 第二步,校验ZIP压缩包解压后的大小。
于是随便拿了个ZIP包本地验了一把,明明算得很准啊,一个字节都不差,是不是测试搞错了?!
再去测试组要了他们搞出来的变态ZIP包验了一把,发现校验得出的解压大小比实际小了许多。
问题:
显然,问题就出在第二步。
有个ZipUtil工具类,注释清一色地道英文,不知道原作者是哪位大神,也不知最初是谁从哪里拷过来的。
这个类提供的校验方法是通过传入ZIP文件的输入流,然后一顿字节操作猛如虎得出解压大小。计算过程涉及的变量和运算没有任何注释,看不懂啊——我摊牌了!
解决:
既然看不懂改不动,网上找替代方案吧。
很快,找到了一个方法改造一下:
/**
* 计算ZIP文件的解压大小
*
* @param filePath 文件路径
* @return 解压大小
*/
public static long getUncompressedSize(String filePath) throws IOException {
ZipFile zipFile = new ZipFile(filePath);
long