Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
Ação recomendada
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}");
}