← Todas as verificações
SegurançaSeveridade típica: Médio

Scanner de cabeçalhos de segurança

Verifica se o teu site envia os principais cabeçalhos HTTP de segurança, como CSP, HSTS e X-Frame-Options.

O que verifica

Este scanner revê os cabeçalhos HTTP de segurança que o teu site envia em cada resposta, como Content-Security-Policy, HSTS e X-Frame-Options. Verifica quais estão presentes e quais faltam. São instruções que o teu servidor dá ao navegador para se proteger.

Porque importa

Sem estes cabeçalhos, o navegador não ativa proteções fundamentais e o teu site fica mais exposto a ataques como injeção de scripts ou clickjacking. Muitas frameworks não os colocam por omissão, por isso é fácil esquecê-los. A sua ausência também baixa a tua nota em auditorias de segurança.

Como se corrige

Acrescenta os cabeçalhos que faltam na configuração do teu servidor, CDN ou framework, onde defines as respostas HTTP. Começa pelos mais importantes: Content-Security-Policy, Strict-Transport-Security e X-Frame-Options. Muitos alojamentos como o Vercel ou o Netlify permitem defini-los num ficheiro de cabeçalhos sem mexer no código.

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.

Verifica-o no teu site

Analisa o teu site grátis e vê se esta e outras 44 verificações passam, com um fix prompt por cada problema.

Analisar o meu site grátis

Do blog

Verificações relacionadas