Melhores práticas para links seguros: proteja os seus URLs de download
Melhores práticas para partilhar links de download seguros. Segurança de tokens em URL, expiração de links, limites de download e prevenção de reencaminhamento não autorizado.
Um link de download seguro trata o próprio URL como parte da chave. O segmento após a barra deve ter pelo menos 128 bits de entropia (pense em hexatransfer.com/d/7Kj9xQmN2vP8rBwLsE4fT), expirar em horas em vez de dias, limitar os downloads a uma ou duas tentativas, e — criticamente — nunca ser o único segredo. Combine-o com uma chave AES-256-GCM derivada de palavra-passe que fica no fragmento do URL (após o #) para nunca aparecer nos logs do servidor, e terá derrotado os vectores de fuga de links mais comuns, desde pré-visualizações do Slack a arquivos de proxies corporativos.
Entropia: a matemática da possibilidade de adivinha
Um segmento de 6 caracteres composto de letras e dígitos tem 36^6 = 2,1 mil milhões de combinações. Parece enorme até perceber que uma botnet pode testar 100.000 URLs por segundo contra uma CDN — ou seja, um atacante não autenticado enumera o espaço completo em aproximadamente seis horas. Passe para 128 bits (22 caracteres de base64url) e o tempo de adivinha ultrapassa a morte por calor do sol. Use crypto.getRandomValues(), nunca Math.random(), e nunca codifique um ID de base de dados. Tokens sequenciais revelam o volume de transferências a qualquer pessoa que coleccione duas amostras com uma semana de diferença.
Coloque a chave no fragmento, não no caminho
Tudo após # num URL é o identificador de fragmento — os navegadores não o enviam para o servidor. Armazenar a chave de desencriptação aí é o padrão que o Firefox Send pioneirou: /#k=abc123xyz. O servidor vê apenas o segmento de download opaco, pelo que os seus logs de acesso, exportações de SIEM e dumps de violação não contêm material de chaves. As caches de CDN edge também não conseguem desencriptar o payload. O Slack elimina o fragmento quando faz a pré-visualização do URL, pelo que o bot nunca vê a chave. Este único truque bloqueia 80% dos ataques práticos de intercepção de links.
Janelas de expiração que correspondem à ameaça
A expiração padrão de 7 dias é demasiado generosa para a maioria dos casos. Calibre para o fluxo de trabalho: uma janela de 15 minutos para um .pdf de transferência bancária, 4 horas para revisão de contrato, 24 horas para um álbum de fotografias, 7 dias apenas para colaboração internacional assíncrona. Exprima a expiração como um timestamp UTC absoluto no payload do URL assinado e aplique-a do lado do servidor — nunca confie num relógio do lado do cliente. Na expiração, sobreponha o texto cifrado em disco com zeros (idealmente via blkdiscard em NVMe) para que uma análise forense posterior ao disco não encontre nada.
Contadores de download que realmente funcionam
Um link de download único parece infalível até perceber que os navegadores fazem retry agressivo em transferências parciais. Se o Chrome cair a 80% e retomar com um novo pedido Range, conta isso como dois downloads? Implemente o contador na fronteira de conclusão do ficheiro, não por pedido HTTP. Incremente apenas quando o último byte é enviado e a tag de autenticação é verificada. Alternativamente, acompanhe IDs de sessão únicos durante uma janela de 10 minutos: uma sessão = um download, independentemente de quantos pedidos Range emite. O WeTransfer confunde estes e tem sido criticado por marcar falsamente links como consumidos.
URLs assinados com tokens de curta duração
Para fluxos empresariais, envolva o URL de download com uma assinatura HMAC-SHA256 sobre (segmento, expiração, max_downloads, issuer_id). O servidor valida a assinatura antes de servir qualquer byte. Os URLs pré-assinados do S3 fazem isto nativamente; o R2 e o Backblaze B2 seguem o mesmo padrão. Um URL assinado que vaze para o Slack ainda é perigoso, mas a expiração curta (por exemplo, 5 minutos) limita os danos. Combine com vinculação de IP — a assinatura inclui o prefixo /24 esperado — para impedir o reencaminhamento de links entre geografias.
Prevenção de fugas via referrer e pré-visualização
Os navegadores enviam o URL completo (menos o fragmento) no cabeçalho Referer a não ser que defina Referrer-Policy: no-referrer na página de download. Sem esse cabeçalho, clicar numa ligação externa a partir da página de download vaza o segmento para cada rastreador no destino. Defina também X-Robots-Tag: noindex, nofollow e um robots.txt que bloqueie /d/, para que o Googlebot não arquive um link que foi acidentalmente colado num fórum. Para pré-visualizações do Slack e Teams, retorne 204 No Content para User-Agents que correspondam aos seus bots de unfurl.
Controlos de reencaminhamento e vinculação ao receptor
Uma vez que a Alice envia um link ao Bob, o Bob pode reencaminhá-lo a qualquer pessoa. Para prevenir isso, vincule o link à identidade do Bob. Opções por ordem crescente de força: verificação por email (token de uso único para bob@empresa.pt), verificação por SMS (OTP para o número +351 xxx), registo de passkey na primeira visita, ou login OIDC via Google Workspace do Bob. Cada passo troca fricção por contenção. Para uma resposta de acesso por titular de dados ao abrigo do Artigo 15 do RGPD, a verificação por email é normalmente suficiente. Para um resultado laboratorial regulado pela HIPAA, pertence uma passkey ou OIDC.
Revogação imediata
Mesmo com todas as protecções em vigor, algo correrá mal — um portátil roubado, um contratado despedido, um receptor errado. Um botão de revogação que mata o link imediatamente é importante. Implementação: mantenha uma lista de revogação com chave no hash do segmento, verificada em cada download. Propague para os edges da CDN dentro de 60 segundos via API de purge (o /zones/:id/purge_cache da Cloudflare aceita uma lista de URLs). O HexaTransfer expõe a revogação através do dashboard do remetente; o Dropbox Transfer e o Smash suportam-na mas cobram extra. Teste a revogação trimestralmente — botões sem efeito durante incidentes são piores do que não ter botão.
Telemetria sem vigilância
Registe o suficiente para detectar abuso (hash de IP, família de User-Agent, timestamp, bytes servidos) mas não o suficiente para reconstruir a identidade do receptor. Haxeie os IPs com uma chave de rotação diária para que as janelas de correlação sejam curtas. Nunca registe o fragmento do URL, obviamente. Uma janela de retenção de 30 dias satisfaz os Critérios Comuns 7.2 do SOC 2 sem criar um arquivo de vigilância. Exponha contadores de abuso ao remetente no dashboard para que vejam "3 tentativas de palavra-passe falhadas de AS15169" e saibam que devem revogar.
Experimente em hexatransfer.com — gratuito, sem conta, até 10 GB.
Envie arquivos grandes com segurança e criptografia de ponta a ponta
Transfira arquivos de até 10 GB gratuitamente com criptografia de ponta a ponta. Sem necessidade de conta. Seus arquivos são criptografados no navegador antes do envio — ninguém mais pode lê-los.
Enviar um arquivo