Como funciona esta verificação
O Scanaris pede a tua página principal como o faria um navegador e lê os cabeçalhos da resposta. Procura seis cabeçalhos concretos e, por cada um que falta, abre um achado com um valor recomendado: Content-Security-Policy, Strict-Transport-Security e X-Frame-Options com severidade média, e X-Content-Type-Options, Referrer-Policy e Permissions-Policy com severidade baixa. Não avalia aqui a qualidade da CSP nem do HSTS: isso fazem-no os checks de CSP fraca e HSTS fraco. Só se olha para a resposta do URL analisado, por isso se a tua API vive noutro domínio, analisa-o à parte.
O que protege cada cabeçalho
- Content-Security-Policy limita de onde podem ser carregados scripts, estilos e imagens. É a defesa principal contra a injeção de scripts (XSS).
- Strict-Transport-Security obriga o navegador a usar sempre HTTPS com o teu domínio, mesmo que alguém escreva o endereço sem o s.
- X-Frame-Options impede que o teu site seja embutido num iframe alheio, que é a base do clickjacking.
- X-Content-Type-Options: nosniff evita que o navegador "adivinhe" o tipo de um ficheiro e execute como script algo que não o era.
- Referrer-Policy controla quanto do URL é enviado a outros sites quando um utilizador clica num link.
- Permissions-Policy desativa APIs do navegador que não usas, como câmara, microfone ou geolocalização.
Como os acrescentar consoante o teu alojamento
Vercel
No vercel.json, ou no next.config com a função headers() se usas Next.js:
{
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" },
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
]
}
]
}
Netlify
Um ficheiro _headers na pasta que é publicada:
/*
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Nuxt
No nuxt.config, dentro de routeRules, a regra '/**' com um objeto headers e os mesmos pares chave-valor. É exatamente o que o Scanaris faz.
Express
import helmet from 'helmet';
app.use(helmet());
nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
A Content-Security-Policy ficou de fora dos exemplos de propósito: depende de que scripts e serviços o teu site carrega e convém começá-la em modo relatório. O procedimento está em cabeçalhos de segurança HTTP explicados para humanos.
Confirma que lá estão
curl -sI https://oteudominio.com | grep -iE "strict-transport|x-frame|x-content-type|referrer-policy|permissions-policy|content-security"
Devem aparecer as seis linhas. Se tens uma CDN à frente do servidor, confirma no URL público, porque algumas CDN removem ou sobrescrevem cabeçalhos. O analisador de cabeçalhos faz a mesma leitura com explicação por cabeçalho.
Perguntas frequentes
X-Frame-Options ou frame-ancestors?
Os dois fazem o mesmo; frame-ancestors dentro da CSP é a versão moderna e permite listar domínios concretos. Mantém o X-Frame-Options também para navegadores antigos; não se atrapalham.
Posso partir o site ao acrescentar estes cabeçalhos?
Os cinco dos exemplos não partem nada num site normal. O único com risco é a CSP, por isso acrescenta-se primeiro em modo Content-Security-Policy-Report-Only e passa-se a bloquear quando os relatórios estiverem limpos.
É preciso preload no HSTS?
Não para passar o check. O preload permite incluir o teu domínio na lista que os navegadores trazem de fábrica; é um compromisso a longo prazo (todo o teu domínio e subdomínios em HTTPS para sempre), por isso ativa-o só quando tiveres a certeza.