從 .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}");
}