Actualizado el

Abrir un archivo comprimido hecho por otra persona

Por

Esta semana empezamos a aceptar carpetas. Descomprimir llevó una tarde. Decidir qué rechazar llevó el resto de la semana.

Suelta aquí una carpeta o un ZIP

Suelta archivos o una carpeta aquí, o elígelos.

HTML, React, carpetas, zips y PDF. Una carpeta sin index.html se abre en la página que parece la inicial.

Blog · Publicado originalmente en inglés el .

Un archivo ZIP no es un simple montón de datos. Son instrucciones de un desconocido sobre dónde escribir archivos y cuánta memoria usar, y todas las bibliotecas de descompresión, por defecto, las obedecen.

Nombres que se salen de la carpeta

Una entrada del ZIP puede llamarse ../../etc/passwd. Si algo une eso a una carpeta, termina en un lugar que nadie pretendía. Es un problema viejo, que hasta tiene nombre, zip slip, y el consejo habitual es limpiar la ruta.

Nosotros preferimos rechazarlo. Estos nombres se convierten en direcciones en el propio origen del sitio, y un nombre que tendríamos que limpiar es un nombre que no entendimos. Limpiar convierte una entrada hostil en una verosímil. Rechazar la convierte en un mensaje que dice qué archivo era el problema.

Archivos pequeños que no son pequeños

Cuarenta kilobytes pueden convertirse en cuatro gigabytes al descomprimirse. La comprobación obvia, descomprimir y luego mirar el tamaño, ocurre cuando la memoria ya se acabó.

Por eso, cada decisión de tamaño se toma con los tamaños que declaran los propios encabezados del ZIP, antes de expandir un solo byte: el total, cada archivo, la cantidad de archivos y la proporción entre comprimido y sin comprimir. Un archivo de cuatro megabytes lleno de ceros ocupa menos de sesenta y cuatro kilobytes comprimido, y se rechaza solo por esa proporción.

Los tamaños declarados también son la palabra de un desconocido, claro. Pero es una palabra que se puede comprobar con poco costo, y que solo nos mete en problemas si declara menos de lo que hay. Y eso la lectura en streaming lo detecta por el camino.

Una lista de lo que entra, no de lo que se queda fuera

Las extensiones que servimos están en una lista. Todo lo demás se rechaza por su nombre, con la extensión en el mensaje, para que la persona sepa qué archivo quitar.

Una lista de lo que se queda fuera sería la promesa de haber pensado en todo. No lo hemos hecho, y nadie lo ha hecho. Un alojamiento estático que sirve .php no es un alojamiento estático, y la forma de estar seguros es nombrar lo que entra en lugar de lo que se queda fuera.

La parte que no tenía que ver con la seguridad

La gente comprime una carpeta, así que todo llega dentro de una carpeta que nadie quería en la dirección. Una sola carpeta común en la raíz se quita. Dos o más significan que el ZIP de verdad está organizado así, y se quedan como están.

Y una carpeta sin index.html antes era un error. No lo es: una carpeta de imágenes, o un informe y su hoja de cálculo, es algo perfectamente razonable para querer en un enlace. Escribimos nosotros la página con la que se abre: una lista de lo que hay dentro, con cada nombre escapado, porque esos nombres vinieron de un desconocido y la página se sirve desde el propio origen del sitio.

Las pruebas se leen como una lista de cosas que el ZIP de un desconocido no tiene permitido decir. Es la forma más útil que encontramos para ellas.

Preguntas

¿Qué pasa con un ZIP que tiene un nombre que se sale de la carpeta?

Se rechaza. Solta no limpia la ruta: la rechaza, con un mensaje que dice qué archivo era el problema.

¿Cómo maneja Solta un ZIP pequeño que se convierte en gigabytes al descomprimirse?

Cada decisión de tamaño usa los tamaños que declaran los encabezados del propio ZIP, antes de expandir un solo byte: el total, cada archivo, la cantidad de archivos y la proporción entre comprimido y sin comprimir. Si el ZIP declara menos de lo que hay, la lectura en streaming lo detecta por el camino.

¿Qué tipos de archivo de un ZIP se publican?

Solo las extensiones que están en una lista. Todo lo demás se rechaza por su nombre, con la extensión en el mensaje, para que sepas qué archivo quitar.

¿Por qué la carpeta de afuera no aparece en la dirección?

Quien comprime una carpeta hace que todo llegue dentro de ella. Una sola carpeta común en la raíz se quita. Si hay dos o más, el ZIP de verdad está organizado así, y se quedan como están.

¿Se puede publicar una carpeta sin index.html?

Sí. Solta escribe la página con la que se abre: una lista de lo que hay dentro, con cada nombre escapado.

Publica directamente desde tu chat de IA

Conecta Solta con Claude o ChatGPT y pídelo: el sitio queda en línea con un enlace, sin copiar código.