Validação CRC32 adicionada ao ler entradas do arquivo ZIP

A partir de .NET 11, a biblioteca System.IO.Compression valida os checksums CRC32 ao ler entradas de arquivo ZIP. Se o checksum CRC32 calculado não corresponder ao valor esperado armazenado nos metadados do ficheiro ZIP, um InvalidDataException é lançado.

Versão introduzida

.NET 11 Prévia 3

Comportamento anterior

Anteriormente, System.IO.Compression não validava as somas de verificação do CRC32 ao ler os arquivos ZIP. Entradas ZIP corrompidas ou adulteradas podiam ser lidas sem erros, podendo causar corrupção silenciosa de dados.

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

Novo comportamento

A partir do .NET 11, a biblioteca verifica a integridade das entradas ZIP durante as operações de leitura. Se a soma de verificação CRC32 calculada não corresponder ao valor esperado dos metadados do ficheiro ZIP, uma exceção InvalidDataException é lançada.

Tipo de mudança disruptiva

Esta alteração é de natureza comportamental .

Motivo da mudança

Esta alteração melhora a fiabilidade e segurança de System.IO.Compression. Ao validar os checksums CRC32, a biblioteca deteta e impede o uso de entradas ZIP corrompidas ou adulteradas, garantindo que as aplicações não processam inadvertidamente dados inválidos. Para mais informações, veja dotnet/runtime#124766.

Se a sua aplicação processar ficheiros ZIP que possam estar corrompidos ou adulterados, trate InvalidDataException adequadamente:

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

APIs afetadas