Carga de archivos: Una funcionalidad de alto riesgo

La funcionalidad de carga de archivos es una de las más sensibles en seguridad. Cada archivo subido es potencialmente malicioso — podría ser un script disfrazado como imagen, una zip bomb o un archivo con nombre diseñado para explotar el sistema de archivos.

Validación de tipos de archivo

Validación del lado del cliente

El atributo accept en inputs de archivo restringe qué archivos puede seleccionar el usuario:

<input type="file" accept=".jpg,.jpeg,.png,.gif" />

Probando validación del cliente:

  1. Seleccionar un tipo válido — debería aceptarse
  2. Intentar seleccionar un tipo inválido — debería rechazarse
  3. Evadir el atributo accept (renombrar .exe a .jpg) — el servidor debe capturarlo

Validación del lado del servidor

El servidor debe validar el contenido real, no solo la extensión:

Caso de pruebaArchivoEsperado
Imagen válidafoto.jpg (JPEG real)Aceptar
Extensión incorrectafoto.txt (JPEG renombrado)Rechazar o aceptar por contenido
Extensión falsamalware.jpg (realmente .exe)Rechazar
Doble extensiónimage.jpg.phpRechazar
SVG con JavaScriptvector.svg (contiene <script>)Sanitizar o rechazar

Testing de tamaño de archivo

Caso de pruebaEsperado
Bajo el límiteAceptar y cargar exitosamente
En el límite exactoAceptar (valor límite)
1 byte sobre el límiteRechazar con mensaje claro
Archivo muy grande (1GB+)Rechazar rápidamente
Archivo vacío (0 bytes)Rechazar o aceptar según spec

Testing de funcionalidad de carga

Progreso y feedback

  • ¿Aparece barra de progreso durante la carga?
  • ¿El porcentaje es preciso?
  • ¿Se puede cancelar una carga en progreso?
  • ¿Qué pasa si el usuario navega a otra página durante la carga?

Carga de múltiples archivos

  • ¿Se pueden seleccionar múltiples archivos a la vez?
  • ¿Hay un máximo de archivos?
  • ¿Se pueden remover archivos individualmente antes del envío?
  • ¿El tamaño total respeta el límite?

Drag and drop

  • ¿Se pueden arrastrar archivos al área de carga?
  • ¿La zona de drop se resalta cuando se arrastra un archivo?
  • ¿Los archivos arrastrados se validan igual que los seleccionados?

Caracteres especiales en nombres de archivo

Prueba con estos patrones:

  • Espacios: mi documento.pdf
  • Unicode: документ.pdf, 档案.pdf
  • Caracteres especiales: archivo (1).jpg
  • Nombres muy largos: 255+ caracteres
  • Sin extensión: README
  • Nombres reservados (Windows): CON.txt, NUL.jpg

Testing de seguridad para cargas de archivos

Carga de archivos ejecutables

Intenta cargar archivos que podrían ejecutarse en el servidor:

  • .php, .asp, .jsp — scripts del servidor
  • .html — podría contener JavaScript
  • .svg — puede contener scripts embebidos
  • .exe, .bat, .sh — ejecutables del sistema

Path traversal

Prueba nombres diseñados para escapar del directorio:

  • ../../../etc/passwd
  • ..\\..\\windows\\system.ini

Testing de zip bomb

Una zip bomb es un archivo comprimido pequeño que se expande enormemente:

  • Sube un zip de 1 KB que se expande a 1 GB+
  • El servidor debería detectar y rechazar bombas de descompresión

Ejercicio: Auditoría de seguridad de carga de archivos

  1. Funcionalidad básica: Carga archivos válidos de cada tipo aceptado
  2. Bypass de tipo: Renombra un ejecutable con extensión de imagen — ¿se rechaza?
  3. Límites de tamaño: Carga un archivo justo sobre el límite
  4. Nombres especiales: Archivos con unicode, espacios y caracteres especiales
  5. Múltiples archivos: Carga el máximo, luego intenta uno más
  6. Cancelar y reintentar: Inicia una carga, cancela, reintenta
  7. Falla de red: Inicia carga y desconecta la red
TestResultado¿Bug?Severidad
.exe renombrado a .jpgCargado exitosamenteCrítica
100 MB (límite: 10 MB)Error solo después de carga completaMedia
Nombre con ../Error 500 del servidorCrítica

Testing post-carga

Después de cargar un archivo:

  1. El archivo puede descargarse sin corrupción
  2. Se almacena de forma segura (no en directorio público)
  3. La URL no es predecible
  4. Imágenes servidas con Content-Type correcto
  5. Archivos no visualizables con Content-Disposition: attachment

Puntos clave

  • Las cargas de archivos son funcionalidades de alto riesgo de seguridad
  • La validación del servidor debe verificar contenido real, no solo extensiones
  • La validación de tamaño debería ser del lado del cliente
  • Prueba nombres con caracteres especiales, unicode y path traversal
  • Los archivos cargados no deben ser ejecutables en el servidor
  • Prueba multi-archivo, drag-and-drop, progreso y cancelación