1

DotNetZip を使用して、外部の (信頼できない) ソースからの zip ファイルを抽出しています。私の問題は、zip ファイル自体は数キロバイトになる可能性がありますが、解凍されたコンテンツはペタバイトになる可能性があることです。解凍する前に非圧縮サイズを確認するにはどうすればよいですか? これを確認して 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 に答える