Walidacja CRC32 dodana podczas odczytywania wpisów archiwum ZIP

Począwszy od .NET 11, biblioteka System.IO.Compression weryfikuje sumy kontrolne CRC32 podczas odczytywania wpisów archiwum ZIP. Jeśli obliczona suma kontrolna CRC32 nie jest zgodna z oczekiwaną wartością przechowywaną w metadanych pliku ZIP, generowany jest wyjątek InvalidDataException.

Wersja wprowadzona

.NET 11 (wersja zapoznawcza 3)

Poprzednie zachowanie

System.IO.Compression Wcześniej nie zweryfikował sum kontrolnych CRC32 podczas odczytywania wpisów archiwum ZIP. Uszkodzone lub naruszone wpisy ZIP mogą być odczytywane bez błędów, co może spowodować dyskretne uszkodzenie danych.

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

Nowe zachowanie

Począwszy od .NET 11, biblioteka weryfikuje integralność wpisów ZIP podczas operacji odczytu. Jeśli obliczona suma kontrolna CRC32 nie jest zgodna z oczekiwaną wartością z metadanych pliku ZIP, zostaje zgłoszony wyjątek InvalidDataException.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Ta zmiana zwiększa niezawodność i bezpieczeństwo programu System.IO.Compression. Sprawdzając sumy kontrolne CRC32, biblioteka wykrywa i zapobiega używaniu uszkodzonych lub naruszonych wpisów ZIP, dzięki czemu aplikacje nie przetwarzają przypadkowo nieprawidłowych danych. Aby uzyskać więcej informacji, zobacz dotnet/runtime#124766.

Jeśli aplikacja przetwarza pliki ZIP, które mogą być uszkodzone lub naruszone, należy odpowiednio obsługiwać 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}");
}

Interfejsy API, których dotyczy problem