我正在使用DotNetZip来提取来自extenal(不值得信赖)来源的zip文件。我的问题是zip文件本身可能是几千字节,但解压缩的内容可能会变成PB级。如何在拆包前查看未压缩的大小?有没有可靠的方法来查看它并防止OutOfMemoryException?
如下所述,可以使用离子拉链完成:
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
完全可靠吗?有人可以更改此信息,使其显示为一个小的未压缩大小?
答案 0 :(得分:2)
不,它不是完全可靠。 zip文件中的未压缩大小肯定会被恶意源更改。您应该使用未压缩的大小来限制使用的内存,如果解压缩超过了,只需停止并拒绝zip文件。你永远不应该依赖输入来避免异常。
可以解码压缩条目并确定其未压缩的大小,而无需实际生成未压缩的输出。但是,如果你要解压缩,那就没什么意义了。解码几乎与解压缩一样长。只需开始解压缩并在达到声明的未压缩大小时停止。
答案 1 :(得分:1)
How to find uncompressed size of ionic zip file这是一个类似的问题,对您有所帮助。 基本上,您遍历每个条目并添加未压缩的大小。