CRC32-validatie toegevoegd bij het lezen van ZIP-archiefvermeldingen

Vanaf .NET 11 valideert de bibliotheek System.IO.Compression CRC32 controlesommen bij het lezen van ZIP-archiefvermeldingen. Als de berekende CRC32-controlesom niet overeenkomt met de verwachte waarde die is opgeslagen in de metagegevens van het ZIP-bestand, wordt er een InvalidDataException gegenereerd.

Geïntroduceerde versie

.NET 11 preview 3

Vorig gedrag

System.IO.Compression Voorheen werd CRC32-controlesommen niet gevalideerd bij het lezen van ZIP-archiefvermeldingen. Beschadigde of gemanipuleerde ZIP-vermeldingen kunnen zonder fouten worden gelezen, waardoor mogelijk stille gegevens beschadigd raken.

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

Nieuw gedrag

Vanaf .NET 11 controleert de bibliotheek de integriteit van ZIP-vermeldingen tijdens leesbewerkingen. Als de berekende CRC32-controlesom niet overeenkomt met de verwachte waarde uit de metagegevens van het ZIP-bestand, wordt er een InvalidDataException gegenereerd.

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

Deze wijziging verbetert de betrouwbaarheid en beveiliging van System.IO.Compression. Door CRC32-controlesommen te valideren, detecteert en voorkomt de bibliotheek het gebruik van beschadigde of gemanipuleerde ZIP-vermeldingen, zodat toepassingen niet per ongeluk ongeldige gegevens verwerken. Zie dotnet/runtime#124766 voor meer informatie.

Als uw toepassing ZIP-bestanden verwerkt die mogelijk beschadigd of gemanipuleerd zijn, moet u InvalidDataException op de juiste manier afhandelen.

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

Betreffende API's