CRC32-validering har lagts till när zip-arkivposter läss

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.

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

Berörda API:er