.NET 11 以降では、zip アーカイブ エントリを読み取るときに、System.IO.Compression ライブラリによって CRC32 チェックサムが検証されます。 計算された CRC32 チェックサムが ZIP ファイルのメタデータに格納されている期待値と一致しない場合は、 InvalidDataException がスローされます。
導入されたバージョン
.NET 11 Preview 3
以前の動作
以前は、ZIP アーカイブ エントリを読み取るときに、 System.IO.Compression は CRC32 チェックサムを検証しませんでした。 破損または改ざんされた ZIP エントリがエラーなしで読み取られる可能性があり、サイレント データの破損の原因になる可能性があります。
using System.IO.Compression;
using var archive = ZipFile.OpenRead("corrupted.zip");
var entry = archive.GetEntry("file.txt")
?? throw new FileNotFoundException("Entry 'file.txt' not found in archive.");
using var stream = entry.Open();
// Data read without any validation of its integrity.
byte[] buffer = new byte[entry.Length];
stream.ReadExactly(buffer);
新しい動作
.NET 11 以降、ライブラリは読み取り操作中に ZIP エントリの整合性を検証します。 計算された CRC32 チェックサムが ZIP ファイルのメタデータの期待値と一致しない場合は、 InvalidDataException がスローされます。
破壊的変更の種類
この変更は 動作の変更です。
変更理由
この変更により、 System.IO.Compressionの信頼性とセキュリティが向上します。 CRC32 チェックサムを検証することで、ライブラリは破損または改ざんされた ZIP エントリの使用を検出して防止し、アプリケーションが誤って無効なデータを処理しないようにします。 詳細については、「 dotnet/runtime#124766」を参照してください。
推奨されるアクション
破損または改ざんされた可能性のある ZIP ファイルをアプリケーションで処理する場合は、 InvalidDataException を適切に処理します。
try
{
using var archive = ZipFile.OpenRead("corrupted.zip");
var entry = archive.GetEntry("file.txt")
?? throw new FileNotFoundException("Entry 'file.txt' not found in archive.");
using var stream = entry.Open();
byte[] buffer = new byte[entry.Length];
stream.ReadExactly(buffer);
}
catch (InvalidDataException ex)
{
Console.WriteLine($"Error reading ZIP entry: {ex.Message}");
}
影響を受ける API
.NET