Ir al contenido
HexaTransfer
Volver al blog
Cifrado y seguridad

Mejores prácticas de enlaces seguros: protege tus URLs de descarga

Mejores prácticas para compartir enlaces de descarga seguros. Seguridad de tokens URL, expiración de enlaces y límites de descarga.

Un enlace de descarga seguro trata la propia URL como parte de la clave. El slug tras la barra debe tener al menos 128 bits de entropía (algo como hexatransfer.com/d/7Kj9xQmN2vP8rBwLsE4fT), expirar en horas en lugar de días, limitar las descargas a uno o dos intentos y — de manera crítica — nunca ser el único secreto. Combínalo con una clave AES-256-GCM derivada de contraseña que viva en el fragmento de URL (tras el #) para que nunca aparezca en los registros del servidor, y habrás derrotado los vectores más comunes de filtración de enlaces, desde las vistas previas de Slack hasta los archivos de proxies corporativos.

Entropía: las matemáticas de la adivinabilidad

Un slug de 6 caracteres formado por letras y dígitos tiene 36^6 = 2.100 millones de combinaciones. Parece enorme hasta que te das cuenta de que una botnet puede probar 100.000 URLs por segundo contra una CDN — lo que significa que un atacante no autenticado enumera el espacio completo en aproximadamente seis horas. Pasa a 128 bits (22 caracteres de base64url) y el tiempo de adivinanza supera la muerte térmica del universo. Usa crypto.getRandomValues(), nunca Math.random(), y nunca codifiques un ID de base de datos. Los tokens secuenciales filtran el volumen de transferencias a cualquiera que recoja dos muestras con una semana de diferencia.

Pon la clave en el fragmento, no en la ruta

Todo lo que viene después de # en una URL es el identificador de fragmento — los navegadores no lo envían al servidor. Almacenar la clave de descifrado allí es el patrón que Firefox Send fue pionero en establecer: /#k=abc123xyz. El servidor solo ve el slug de descarga opaco, de modo que sus registros de acceso, exportaciones de SIEM y volcados de brechas no contienen material de clave. Los cachés CDN en el borde tampoco pueden descifrar el payload. Las expansiones de Slack eliminan el fragmento cuando sondean la URL, así que el bot de vista previa nunca ve la clave. Este único truco bloquea el 80% de los ataques prácticos de intercepción de enlaces.

Ventanas de expiración que se adaptan a la amenaza

La expiración predeterminada de 7 días es demasiado generosa para la mayoría de los casos de uso. Calibra según el flujo de trabajo: una ventana de 15 minutos para un PDF de transferencia bancaria, 4 horas para la revisión de un contrato, 24 horas para un álbum de fotos, 7 días solo para colaboración internacional asíncrona. Expresa la expiración como un timestamp UTC absoluto en el payload de la URL firmada y aplícalo en el servidor — nunca confíes en un reloj del lado del cliente. Al expirar, sobreescribe el texto cifrado en disco con ceros (idealmente mediante blkdiscard en NVMe) para que un posterior análisis forense del disco no encuentre nada.

Contadores de descarga que realmente funcionan

Un enlace de descarga única parece hermético hasta que te das cuenta de que los navegadores reintentan agresivamente las transferencias parciales. Si Chrome se cae al 80% y reanuda con una nueva solicitud Range, ¿cuenta como dos descargas? Implementa el contador en el límite de finalización del archivo, no por solicitud HTTP. Incrementa solo cuando el último byte se entregue y la etiqueta de autenticación se verifique. Alternativamente, rastrea IDs de sesión únicos en una ventana de 10 minutos: una sesión = una descarga, independientemente de cuántas solicitudes Range emita. WeTransfer confunde estos y ha sido criticado por marcar falsamente los enlaces como consumidos.

URLs firmadas con tokens de corta duración

Para flujos empresariales, envuelve la URL de descarga con una firma HMAC-SHA256 sobre (slug, expiración, max_descargas, issuer_id). El servidor valida la firma antes de servir cualquier byte. Las URLs prefirmadas de S3 hacen esto de forma nativa; R2 y Backblaze B2 siguen el mismo patrón. Una URL firmada que se filtra a Slack sigue siendo peligrosa, pero la corta expiración (digamos, 5 minutos) limita el daño. Combina esto con vinculación de IP — la firma incluye el prefijo /24 esperado — para frustrar el reenvío de enlaces entre geografías.

Prevenir filtraciones por referente y vista previa

Los navegadores envían la URL completa (menos el fragmento) en la cabecera Referer a menos que establezcas Referrer-Policy: no-referrer en la página de descarga. Sin esa cabecera, hacer clic en un enlace externo desde la página de descarga filtra el slug a cada rastreador del destino. Establece también X-Robots-Tag: noindex, nofollow y un robots.txt que bloquee /d/, para que Googlebot no archive un enlace que haya sido pegado accidentalmente en un foro. Para las vistas previas de Slack y Teams, devuelve un 204 No Content a User-Agents que coincidan con sus bots de expansión.

Controles de reenvío y vinculación al receptor

Una vez que Alicia envía a Bob un enlace, Bob puede reenviarlo a cualquiera. Para evitarlo, vincula el enlace a la identidad de Bob. Opciones en orden creciente de fortaleza: verificación por email (token de un solo uso a bob@empresa.com), verificación por SMS (OTP al número de teléfono), registro de passkey en la primera visita, o inicio de sesión OIDC mediante Google Workspace de Bob. Cada paso intercambia fricción por contención. Para una respuesta de acceso del interesado según el Artículo 15 del RGPD, la verificación por email suele ser suficiente. Para un resultado de laboratorio regulado por la LOPD-GDD, corresponde passkey u OIDC.

Revocación bajo demanda

Incluso con todas las protecciones en su lugar, algo saldrá mal — un portátil robado, un contratista despedido, un destinatario equivocado. Un botón de revocar que mata el enlace al instante importa. Implementación: mantén una lista de revocación con clave en el hash del slug, comprobada en cada descarga. Propaga a los nodos CDN en 60 segundos mediante la API de purga (el /zones/:id/purge_cache de Cloudflare acepta una lista de URLs). HexaTransfer expone la revocación a través del panel de control del emisor; Dropbox Transfer y Smash lo admiten ambos pero cobran extra. Prueba la revocación trimestralmente — los botones que no funcionan durante incidentes son peores que no tener botón.

Telemetría sin vigilancia

Registra suficiente para detectar abusos (hash de IP, familia de User-Agent, timestamp, bytes servidos) pero no suficiente para reconstruir la identidad del receptor. Aplica hash a las IPs con una clave rotada diariamente para que las ventanas de correlación sean cortas. Nunca registres el fragmento de URL, obviamente. Una ventana de retención de 30 días satisface el Criterio Común SOC 2 7.2 sin crear un archivo de vigilancia. Expón los contadores de abuso al emisor en el panel de control para que vean "3 intentos de contraseña fallidos desde AS15169" y sepan que deben revocar.

Pruébalo en hexatransfer.com — gratis, sin cuenta, hasta 10 GB.

Envía archivos grandes de forma segura con cifrado de extremo a extremo

Transfiere archivos de hasta 10 GB gratis con cifrado de extremo a extremo. Sin necesidad de cuenta. Tus archivos se cifran en tu navegador antes de subirlos: nadie más puede leerlos.

Enviar un archivo