背景:
测试组搞了个“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 uncompressedSize = 0;
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
uncompressedSize += entries.nextElement().getSize();
ZIP炸弹防御:解压大小校验问题解析

本文讲述了在遇到ZIP炸弹攻击时,后台系统未能有效识别的问题。通过排查,发现校验ZIP解压大小的代码存在缺陷。文章详细描述了从问题定位、代码阅读到寻找替代方案的过程,包括遇到的`ZipException`和编码问题,并最终优化了解压大小计算的效率。
最低0.47元/天 解锁文章
979

被折叠的 条评论
为什么被折叠?



