读取 ZIP 存档条目时已添加 CRC32 验证

从 .NET 11 开始,System.IO.Compression 库在读取 ZIP 存档条目时验证 CRC32 校验码。 如果计算的 CRC32 校验和与 ZIP 文件的元数据中存储的预期值不匹配,则会引发一个 InvalidDataException

引入的版本

.NET 11 预览版 3

以前的行为

之前,System.IO.Compression 在读取 ZIP 存档条目时不会验证 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