Validation CRC32 ajoutée lors de la lecture des entrées d’archive ZIP

À compter de .NET 11, la bibliothèque System.IO.Compression valide les sommes de contrôle CRC32 lors de la lecture des entrées d’archive ZIP. Si la somme de contrôle CRC32 calculée ne correspond pas à la valeur attendue stockée dans les métadonnées du fichier ZIP, une InvalidDataException est levée.

Version introduite

.NET 11 Preview 3

Comportement antérieur

Auparavant, System.IO.Compression ne validait pas les sommes de contrôle CRC32 lors de la lecture des entrées d’archive ZIP. Les entrées ZIP endommagées ou falsifiées peuvent être lues sans erreur, ce qui peut entraîner une altération silencieuse des données.

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

Nouveau comportement

À compter de .NET 11, la bibliothèque vérifie l’intégrité des entrées ZIP pendant les opérations de lecture. Si la somme de contrôle CRC32 calculée ne correspond pas à la valeur attendue stockée dans les métadonnées du fichier ZIP, une InvalidDataException est levée.

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Cette modification améliore la fiabilité et la sécurité de System.IO.Compression. En validant les sommes de contrôle CRC32, la bibliothèque détecte et empêche l’utilisation d'entrées ZIP endommagées ou falsifiées, garantissant ainsi que les applications ne traitent pas accidentellement de données non valides. Pour plus d’informations, consultez dotnet/runtime#124766.

Si votre application traite les fichiers ZIP qui peuvent être endommagés ou falsifiés, gérez InvalidDataException correctement :

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

API affectées