1

我正在使用 DotNetZip 提取来自外部(不可信)来源的 zip 文件。我的问题是 zip 文件本身可能有几千字节,但解压缩后的内容可能会变成 PB。解压前如何查看未压缩的大小?是否有可靠的方法来查看并防止 OutOfMemoryException?

如下所示,可以使用 ionic zip 完成:

using (ZipFile zip = ZipFile.Read(zipFile))
                {
                 // Option 2 - will need to sift through the mass of info

                 info = zip.Info;

foreach (ZipEntry e in zip)
                    {
                        long uncompressedsize = e.UncompressedSize;
                        // Option 1
                        totaluncompressedsize += uncompressedsize;
                    }
                 }

但问题仍然存在:UncompressedSize完全可靠吗?有人可以更改此信息以使其显示为未压缩的小尺寸吗?

4

2 回答 2

2

不,它并不完全可靠。zip 文件中的未压缩大小当然可以被恶意来源更改。您应该使用未压缩的大小来限制使用的内存,如果解压超过了,只需停止并拒绝 zip 文件。您永远不应该依赖输入来避免异常。

可以解码压缩条目并确定其未压缩大小,而无需实际生成未压缩输出。但是,如果您无论如何都要解压缩,那并没有多大意义。解码几乎与解压缩一样长。当您达到声称的未压缩大小时,只需开始解压缩并停止。

于 2013-10-14T22:18:37.557 回答
1

How to find uncompressed size of ionic zip file是一个类似的问题,可能会对您有所帮助。基本上,您遍历每个条目并添加未压缩的大小。

于 2013-10-14T18:16:14.233 回答