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