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

Scanner de CSP fraca

Deteta diretivas inseguras como 'unsafe-inline' ou 'unsafe-eval' que enfraquecem a proteção da tua CSP contra XSS.

O que verifica

Este scanner analisa a tua Content-Security-Policy em busca de diretivas inseguras como unsafe-inline ou unsafe-eval. Essas opções relaxam tanto a política que deixam de te proteger de forma eficaz. O scanner só revê como a CSP está definida, não a reescreve.

Porque importa

Uma CSP com estas diretivas mal trava os ataques de injeção de scripts (XSS) que devia bloquear. Dá uma falsa sensação de segurança: parece que estás protegido, mas a proteção está oca. Um atacante que injete código consegue executá-lo sem problemas.

Como se corrige

Remove unsafe-inline e unsafe-eval da tua política e substitui-os por uma abordagem baseada em nonces ou hashes para os scripts de que realmente precisas. Começa com uma política estrita e vai permitindo apenas o essencial. Testa as alterações com cuidado, já que uma CSP mal ajustada pode partir funcionalidades legítimas.

Como funciona esta verificação

Este check só atua se o teu site já envia um cabeçalho Content-Security-Policy; se não o envia, é o scanner de cabeçalhos que o marca. O Scanaris lê a política completa e procura as duas palavras que a esvaziam: 'unsafe-inline', que permite executar qualquer script ou estilo escrito diretamente no HTML, e 'unsafe-eval', que permite transformar texto em código com eval e semelhantes. Se aparecer alguma, abre um achado de severidade baixa com a lista de fraquezas encontradas. É baixa porque ter uma CSP imperfeita continua a ser melhor do que não ter nenhuma, mas a proteção contra injeção de scripts, que é a razão de ser da CSP, fica quase anulada.

Porque importa

Uma CSP estrita faz com que, mesmo que um atacante consiga meter um <script> na tua página (por um comentário não sanitizado, um parâmetro refletido ou uma biblioteca comprometida), o navegador se recuse a executá-lo. Com 'unsafe-inline' em script-src, esse script injetado executa-se na mesma: o cabeçalho está lá, o cadeado parece fechado, mas a porta está aberta. Onde está a palavra importa: em script-src é grave; em style-src é um risco muito menor que muitos sites aceitam pelos seus estilos em linha.

Como corrigir

1. Nonces para os scripts em linha

Um nonce é um valor aleatório diferente em cada pedido que pões no cabeçalho e em cada etiqueta <script> legítima. O navegador executa só os scripts que levam esse valor; um script injetado não o conhece.

Content-Security-Policy: script-src 'nonce-R4nd0m' 'strict-dynamic'; object-src 'none'; base-uri 'self'

O Next.js fá-lo no middleware, gerando o nonce e passando-o ao cabeçalho e aos componentes; o Nuxt, com um plugin de servidor que o injeta em cada resposta (é o que o Scanaris faz); o Express, com um middleware que o guarda em res.locals e o imprime nos templates.

2. Hashes para scripts fixos

Se um script em linha nunca muda, calcula o seu hash SHA-256 e põe-no na política: 'sha256-…'. Serve para fragmentos pequenos, como o de um gestor de etiquetas, sem montar nonces.

3. Mover o código para ficheiros

Os handlers onclick="…" e os blocos de script no HTML são a causa habitual de precisar de 'unsafe-inline'. Passa-os para ficheiros .js servidos a partir do teu domínio e a necessidade desaparece.

4. Tirar o unsafe-eval

Costuma ser exigido por uma biblioteca antiga ou um modo de desenvolvimento de uma framework que se infiltrou em produção. Confirma na consola do navegador o que o pede e atualiza ou substitui essa peça.

5. Publicar em modo relatório

Publica primeiro a política nova como Content-Security-Policy-Report-Only com uma diretiva report-to ou report-uri para um endpoint teu. Durante uns dias recolhe o que bloquearia, ajusta, e quando os relatórios estiverem limpos muda-a para o cabeçalho que bloqueia.

Confirma que está corrigido

curl -sI https://oteudominio.com | grep -i "content-security-policy"

Em script-src não deve aparecer 'unsafe-inline' nem 'unsafe-eval'. Depois navega pelo teu site com a consola aberta: qualquer bloqueio aparece lá com a diretiva que o causou. A teoria completa está em cabeçalhos de segurança HTTP explicados para humanos.

Perguntas frequentes

Uso Tailwind ou estilos em linha. Tenho de tirar o unsafe-inline do style-src?

É desejável mas não urgente. Os estilos em linha não executam código. Dá prioridade ao script-src; uma política com 'unsafe-inline' só em style-src protege do que importa.

O Google Tag Manager ou um chat de suporte obrigam-me a relaxar a política.

Quase todos têm documentação de CSP: aceitam um nonce ou publicam os hashes e domínios de que precisam. Acrescenta as suas origens a script-src e connect-src em vez de abrires tudo.

A CSP vai partir-me o site?

Só se a passares a bloquear sem testar. Para isso existe o modo relatório: mostra-te o que partiria sem o partir.

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