Express.js
File uploads seguros
Explica cómo recibir archivos con límites, almacenamiento temporal, validación real, nombres seguros, escaneo y procesamiento fuera del request.
- Última actualización
- Actualizada
- Nivel
- Profundización
Express.js
Explica cómo recibir archivos con límites, almacenamiento temporal, validación real, nombres seguros, escaneo y procesamiento fuera del request.
Un upload es contenido hostil hasta demostrar lo contrario. Nombre, extensión y MIME type enviados por el cliente son metadata no confiable.
Un flujo seguro separa recepción, validación, almacenamiento y publicación:
stream multipart
→ límites
→ almacenamiento temporal o directo
→ inspección
→ cuarentena
→ metadata persistida
→ acceso autorizadoExpress no procesa multipart de forma integrada. Herramientas como Busboy o Multer interpretan boundaries. Configura límites:
const upload = multer({
storage: multer.memoryStorage(),
limits: {
fileSize: 5 * 1024 * 1024,
files: 1,
fields: 10,
},
});memoryStorage solo conviene para archivos pequeños. Para grandes, usa streaming o upload directo a object storage.
Comprueba:
Un archivo llamado photo.jpg puede contener HTML o un ejecutable.
Nunca uses originalname como path del servidor. Genera un ID:
tenants/{tenantId}/uploads/{uuid}Guarda el nombre original solo como metadata sanitizada para descarga. Esto evita traversal, colisiones y caracteres especiales.
Simple, pero puede ser efímero, no compartido y difícil de escalar.
Facilita durabilidad, lifecycle, CDN y signed URLs. Aun así necesita autorización y políticas de bucket.
El backend genera una URL firmada y el cliente sube directamente. Reduce ancho de banda de la app, pero necesitas confirmar metadata, tamaño y ownership después.
Para archivos de riesgo:
No publiques antes de completar la decisión.
Decodificar y volver a codificar puede eliminar metadata o payloads, pero las librerías de imagen también tienen vulnerabilidades. Limita píxeles, memoria y tiempo.
No los sirvas con express.static. Autoriza primero y luego:
sendFile desde un root seguroUn comprobante de pedido:
../.Proxying ofrece control central, pero consume recursos. Upload directo escala mejor, aunque complica confirmación y validación. Antivirus reduce riesgo, pero añade latencia y falsos positivos.
express.static?Static files y downloads diferencia assets públicos, respuestas autorizadas y cache de contenido.