Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Från och med .NET 11 validerar System.IO.Compression-biblioteket CRC32-kontrollsummor när zip-arkivposter läss. Om den beräknade CRC32-kontrollsumman inte matchar det förväntade värdet som lagras i ZIP-filens metadata genereras en InvalidDataException .
Version lanserad
.NET 11 Förhandsversion 3
Tidigare beteende
System.IO.Compression verifierade tidigare inte CRC32-kontrollsummor vid läsning av zip-arkivposter. Skadade eller manipulerade ZIP-poster kan läsas utan fel, vilket kan leda till tyst datakorruption.
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);
Nytt beteende
Från och med .NET 11 verifierar biblioteket zip-posternas integritet under läsåtgärder. Om den beräknade CRC32-kontrollsumman inte matchar det förväntade värdet från ZIP-filens metadata genereras en InvalidDataException .
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Den här ändringen förbättrar tillförlitligheten och säkerheten för System.IO.Compression. Genom att verifiera CRC32-kontrollsummor identifierar och förhindrar biblioteket användning av skadade eller manipulerade ZIP-poster, vilket säkerställer att program inte oavsiktligt bearbetar ogiltiga data. Mer information finns i dotnet/runtime#124766.
Rekommenderad åtgärd
Om ditt program bearbetar ZIP-filer som kan vara skadade eller manipulerade kan du hantera InvalidDataException följande:
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}");
}