Freigeben über


CRC32-Überprüfung beim Lesen von ZIP-Archiveinträgen hinzugefügt

Ab .NET 11 überprüft die System.IO.Compression-Bibliothek CRC32-Prüfsummen beim Lesen von ZIP-Archiveinträgen. Wenn die berechnete CRC32-Prüfsumme nicht mit dem erwarteten Wert übereinstimmt, der in den Metadaten der ZIP-Datei gespeichert ist, wird ein InvalidDataException Fehler ausgelöst.

Eingeführt in Version

.NET 11 Vorschau 3

Bisheriges Verhalten

Zuvor hat System.IO.Compression beim Lesen von ZIP-Archiv-Einträgen die CRC32-Prüfsummen nicht überprüft. Beschädigte oder manipulierte ZIP-Einträge können ohne Fehler gelesen werden, wodurch möglicherweise stille Datenbeschädigung verursacht wird.

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

Neues Verhalten

Ab .NET 11 überprüft die Bibliothek die Integrität von ZIP-Einträgen während lesevorgängen. Wenn die berechnete CRC32-Prüfsumme nicht mit dem erwarteten Wert aus den Metadaten der ZIP-Datei übereinstimmt, wird ein InvalidDataException Fehler ausgelöst.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Diese Änderung verbessert die Zuverlässigkeit und Sicherheit von System.IO.Compression. Durch die Überprüfung von CRC32-Prüfsummen erkennt und verhindert die Bibliothek die Verwendung beschädigter oder manipulierter ZIP-Einträge, wodurch sichergestellt wird, dass Anwendungen versehentlich ungültige Daten verarbeiten. Weitere Informationen finden Sie unter dotnet/runtime#124766.

Wenn Ihre Anwendung ZIP-Dateien verarbeitet, die beschädigt oder manipuliert werden können, behandeln Sie InvalidDataException dies entsprechend:

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

Betroffene APIs