Parte 1 da série "Segurança Web na UE: 10 Passos Para uma Melhor Classificação"
O Problema em 30 Segundos
O seu website tem um certificado TLS. Ótimo. Mas quando um utilizador escreve http://o-seu-dominio.pt — o que acontece?
Sem HSTS: O navegador liga-se sem encriptação. O website redireciona para HTTPS. Mas nos milissegundos entre o pedido HTTP e o redirecionamento, um atacante na mesma rede (Wi-Fi de café, aeroporto, hotel) pode sequestrar a ligação. Man-in-the-middle, roubo de cookies, sequestro de sessão — tudo trivial.
Com HSTS: O navegador já sabe que este domínio apenas aceita HTTPS. Liga-se diretamente com encriptação. Sem pedido HTTP, sem redirecionamento, sem janela de ataque.
Um cabeçalho. Uma linha. E 72,4% dos websites europeus não o têm.
O Que os Dados Mostram
Do SiteGuardian Benchmark com mais de 700 000 websites europeus:
- 27,6% têm o HSTS ativado
- 75,7% redirecionam para HTTPS — mas sem HSTS, o redirecionamento é vulnerável a ataques
- 24,3% nem sequer redirecionam, apesar de terem um certificado válido
Isto significa: três em cada quatro websites com certificado TLS não o utilizam de forma consistente. O certificado existe, a proteção não.
O Que É Exatamente o HSTS?
O HTTP Strict Transport Security (RFC 6797) é um cabeçalho de resposta HTTP que diz ao navegador:
"Liga-te a este domínio durante os próximos X segundos exclusivamente por HTTPS. Ignora o HTTP completamente."
O cabeçalho tem este aspeto:
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age=31536000— 1 ano (em segundos). O navegador recorda a instrução durante este período.includeSubDomains— aplica-se a todos os subdomínios (api.o-seu-dominio.pt, mail.o-seu-dominio.pt, etc.)
Após a primeira visita, o navegador liga-se diretamente por HTTPS em cada pedido subsequente — sem o desvio pelo HTTP.
Como Ativar o HSTS
Apache (.htaccess ou vhost.conf)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Pré-requisito: o mod_headers deve estar ativado.
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
O always no final garante que o cabeçalho é enviado mesmo em páginas de erro (4xx, 5xx).
Caddy
O Caddy define o HSTS automaticamente quando o HTTPS está ativo. Não é preciso fazer nada.
Node.js / Express
app.use((req, res, next) => {
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
next();
});
Ou com o pacote helmet:
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true }));
WordPress
O plugin "Really Simple SSL" ou "HTTP Headers" ativa o HSTS com um único clique. Em alternativa, adicione-o ao .htaccess (ver Apache acima).
Alojamento Gerido (Cloudflare, AWS, Platform.sh, etc.)
A maioria dos fornecedores de alojamento não define o HSTS por defeito. Verifique o painel de controlo em "Definições SSL/TLS" ou "Cabeçalhos HTTP". Se a opção não estiver disponível, crie um ficheiro .htaccess na raiz do website.
Três Erros a Evitar
1. Definir max-age demasiado curto
max-age=86400 (1 dia) apenas protege utilizadores que visitaram o website nas últimas 24 horas. Comece com 30 dias (2592000) e depois aumente para 1 ano (31536000) quando tudo estiver a funcionar.
2. Esquecer o includeSubDomains
Sem includeSubDomains, os seus subdomínios continuam acessíveis por HTTP. Se mail.o-seu-dominio.pt ou intranet.o-seu-dominio.pt não possuem TLS, adicione includeSubDomains apenas quando todos os subdomínios suportarem HTTPS — caso contrário, deixarão de funcionar.
3. Ativar HSTS sem um redirecionamento HTTPS funcional
O HSTS exige que o website esteja efetivamente acessível por HTTPS. Teste antes de ativar: navegue para https://o-seu-dominio.pt. Se surgir um erro, corrija primeiro a configuração do certificado TLS.
HSTS Preload: O Passo Seguinte
Quando o HSTS estiver a funcionar e tiver a certeza de que todos os subdomínios suportam HTTPS, candidate o seu domínio à lista HSTS preload:
- Defina o cabeçalho como:
max-age=31536000; includeSubDomains; preload - Submeta o seu domínio em: hstspreload.org
A lista preload está integrada no Chrome, Firefox, Safari e Edge. Os domínios na lista são sempre carregados por HTTPS — mesmo na primeira visita, antes de o navegador ter alguma vez visto o cabeçalho HSTS.
A Relação com a NIS2 e o RGPD
O HSTS não é mencionado pelo nome em nenhuma lei. Mas:
-
NIS2, art. 21.o, n.o 2, alínea d) exige "segurança na aquisição, desenvolvimento e manutenção de redes e sistemas de informação, incluindo o tratamento e a divulgação de vulnerabilidades". Um cabeçalho HSTS em falta é uma vulnerabilidade conhecida, trivialmente explorável.
-
RGPD, art. 32.o exige "medidas técnicas adequadas" para proteger dados pessoais. Encriptação de transporte sem HSTS é como uma fechadura sem trinco — parece segura, mas pode ser aberta com um único movimento.
Verifique o Seu Domínio
Ative o HSTS, aguarde 5 minutos e analise o seu domínio:
A análise mostrará imediatamente se o HSTS está corretamente definido, se o includeSubDomains está ativo e se o seu domínio se qualifica para a lista preload.
Na próxima semana na Parte 2: DMARC — de none a reject. Porque policy=none não protege ninguém, e como alcançar uma política DMARC eficaz em três passos.
Este artigo faz parte da série "Segurança Web na UE: 10 Passos Para uma Melhor Classificação". Dados do SiteGuardian EU Web Security Benchmark com mais de 700 000 websites europeus.