讀取 ZIP 壓縮檔條目時新增的 CRC32 驗證功能

從 .NET 11 開始,System.IO.Compression 函式庫在讀取 ZIP 壓縮檔時會驗證 CRC32 校驗碼。 如果計算出的 CRC32 校驗和與 ZIP 檔案中繼資料中的預期值不符,就會引發一個錯誤 InvalidDataException。

所推出的版本

.NET 11

以前的行為

讀取 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 檔案元資料的預期值不符,就會拋出 an 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