Como funciona esta verificação
Este check só atua se o teu site já envia o cabeçalho Strict-Transport-Security; se falta por completo, marca-o o scanner de cabeçalhos. O Scanaris lê o valor e verifica duas coisas: que o max-age é de pelo menos um ano (31536000 segundos) e que inclui includeSubDomains. Se qualquer uma falhar, abre um achado de severidade baixa com o detalhe. É baixa porque um HSTS curto ou parcial continua a proteger alguma coisa; mas deixa buracos que um atacante pode aproveitar.
O que faz o HSTS e porquê os dois atributos
Quando o navegador recebe este cabeçalho por HTTPS, aponta o teu domínio numa lista interna e, durante o tempo que o max-age disser, converte qualquer tentativa de ir por http:// em https:// antes de enviar o que quer que seja. Isso elimina o primeiro pedido sem cifragem que um redirecionamento não consegue evitar. Um max-age de umas horas ou dias deixa o utilizador desprotegido de cada vez que expira; daí o mínimo de um ano. Sem includeSubDomains, um atacante pode atacar qualquercoisa.oteudominio.com por HTTP e, pela forma como funcionam os cookies de domínio, roubar ou fixar cookies que valem para o site principal.
Como corrigir
O valor recomendado:
Strict-Transport-Security: max-age=31536000; includeSubDomains
- Vercel: põe-no por defeito nos domínios próprios; se usas
vercel.jsonounext.configpara outros cabeçalhos, acrescenta-o aí com esse valor. - Netlify: no ficheiro
_headers, sob/*. - Nuxt: em
routeRulesdonuxt.config, regra'/**'. - nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;dentro do blocoserverde 443. - Express:
helmet.hsts({ maxAge: 31536000, includeSubDomains: true }).
Antes de acrescentares includeSubDomains, confirma que todos os teus subdomínios servem HTTPS: o painel de administração, a API, o blog noutro fornecedor, o subdomínio de email se tiver site. Qualquer um que só responda por HTTP deixará de funcionar nos navegadores que já viram o cabeçalho, e não há forma de o desfazer até expirar o max-age. Se não tens a certeza, começa com max-age=86400 e sem subdomínios, revê, e sobe o valor quando tudo funcionar.
Preload
Com preload e um max-age de pelo menos um ano podes pedir que o teu domínio entre na lista que o Chrome, o Firefox e o Safari trazem de fábrica: assim nem sequer a primeira visita vai por HTTP. É a diferença habitual entre um A e um A+ nas ferramentas de análise. Mas é um compromisso quase irreversível (sair da lista demora meses), por isso fá-lo só quando todo o domínio estiver há tempo em HTTPS sem incidentes.
Confirma que está corrigido
curl -sI https://oteudominio.com | grep -i strict-transport
Deve mostrar um max-age de 31536000 ou mais e includeSubDomains. Confirma no URL público: se tens uma CDN à frente, é ela que tem de o enviar.
Perguntas frequentes
O HSTS substitui o redirecionamento de HTTP para HTTPS?
Não. O cabeçalho só chega por HTTPS, por isso a primeira visita continua a precisar do redirecionamento. São complementares: o redirecionamento para a primeira vez, o HSTS para todas as outras.
Tenho um subdomínio interno que só vai por HTTP.
Então não ponhas includeSubDomains até o migrares, e aceita o achado de severidade baixa entretanto. Um subdomínio sem cifragem é um risco real para os cookies do domínio, por isso a migração vale a pena.
O que acontece se o configurar mal?
Os navegadores que receberam o cabeçalho vão lembrar-se da política até expirar. Podes enviar max-age=0 para lhes pedir que a esqueçam, mas só o verão os que voltarem a visitar-te por HTTPS. Por isso convém começar com valores curtos.