Aggiunta convalida CRC32 durante la lettura delle voci di archivio ZIP

A partire da .NET 11, la libreria System.IO.Compression convalida i checksum CRC32 durante la lettura delle voci di archivio ZIP. Se il checksum CRC32 calcolato non corrisponde al valore previsto archiviato nei metadati del file ZIP, viene generata un'eccezione InvalidDataException .

Versione introdotta

.NET 11 Preview 3

Comportamento precedente

In precedenza, System.IO.Compression non convalidava i checksum CRC32 durante la lettura delle voci di archivio ZIP. Le voci ZIP danneggiate o manomesse potrebbero essere lette senza errori, potenzialmente causando un danneggiamento silenzioso dei dati.

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

Nuovo comportamento

A partire da .NET 11, la libreria verifica l'integrità delle voci ZIP durante le operazioni di lettura. Se il checksum CRC32 calcolato non corrisponde al valore previsto dai metadati del file ZIP, viene generata un'eccezione InvalidDataException .

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

Questa modifica migliora l'affidabilità e la sicurezza di System.IO.Compression. Convalidando i checksum CRC32, la libreria rileva e impedisce l'uso di voci ZIP danneggiate o manomesse, assicurando che le applicazioni non elaborino accidentalmente dati non validi. Per altre informazioni, vedere dotnet/runtime#124766.

Se l'applicazione elabora file ZIP che potrebbero essere danneggiati o manomessi, gestire InvalidDataException in modo appropriato:

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

Le API interessate