Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de .NET 11, la biblioteca System.IO.Compression valida las sumas de comprobación de CRC32 al leer las entradas de archivos ZIP. Si la suma de comprobación de CRC32 procesada no tiene el mismo valor que el está almacenado en los metadatos del archivo ZIP, se activa una excepción InvalidDataException.
Versión introducida
.NET 11 Preview 3
Comportamiento anterior
Anteriormente, System.IO.Compression no validaba la suma de comprobación de CRC32 al leer entradas de archivos ZIP. Las entradas ZIP dañadas o manipuladas podrían leerse sin errores, lo que podría provocar daños en los datos silenciosos.
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);
Nuevo comportamiento
A partir de .NET 11, la biblioteca comprueba la integridad de las entradas ZIP durante las operaciones de lectura. Si la suma de comprobación de CRC32 procesada no tiene el mismo valor que el esperado en los metadatos del archivo ZIP, se activa una excepción InvalidDataException.
Tipo de cambio disruptivo
Este es un cambio de comportamiento.
Motivo del cambio
Este cambio mejora la confiabilidad y la seguridad de System.IO.Compression. Al validar las sumas de comprobación de CRC32, la biblioteca detecta e impide el uso de entradas ZIP dañadas o manipuladas, lo que garantiza que las aplicaciones no procesen por error datos no válidos. Para obtener más información, consulte dotnet/runtime#124766.
Acción recomendada
Si la aplicación procesa archivos ZIP que podrían estar dañados o alterados, controle InvalidDataException correctamente:
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}");
}