Utilia

Gerador de Content Security Policy (CSP)

Cria um cabeçalho Content-Security-Policy, uma etiqueta meta e uma versão Report-Only com modelos, nonces e hashes SHA-256, e analisa uma política existente.

Começar a partir de um modelo

Os domínios da Google são exemplos tirados das orientações de CSP da Google para a etiqueta Google. A Google altera-os de vez em quando: consulta a documentação atual e remove o que não usas.

Diretivas

Origens separadas por espaços. Deixa um campo vazio para omitir a diretiva (as diretivas de obtenção recorrem então a default-src).

Adição rápida

Um nonce tem de ser um valor aleatório novo em cada resposta, gerado pelo teu servidor e repetido em cada <script nonce="…">. Um nonce fixo não protege nada.

Calcular o hash de um script ou estilo inline

O hash abrange o texto exato entre as etiquetas, incluindo espaços e quebras de linha: qualquer alteração exige um novo hash. Os handlers de eventos inline (onclick=…) também precisam de 'unsafe-hashes'.

Relatórios de violações

Adiciona report-uri (navegadores mais antigos) e report-to com um cabeçalho Reporting-Endpoints.

Numa etiqueta <meta>, os navegadores ignoram frame-ancestors, report-uri, report-to e sandbox, e o Report-Only não é suportado. Coloca a etiqueta no topo do <head>: só se aplica ao conteúdo que vem depois dela.

Análise desta política

Avaliar uma política existente

Como criar uma política

  1. Escolhe um ponto de partida em Começar a partir de um modelo: Estrita (nonce + strict-dynamic), Site estático fechado, Site típico ou Típico + Google Analytics / Ads. O editor abre com o modelo de site típico.
  2. Ajusta as Diretivas. Cada campo aceita origens separadas por espaços; um campo vazio deixa a diretiva de fora.
  3. Usa a Adição rápida para acrescentar uma palavra-chave à Diretiva escolhida: 'self', 'none', 'unsafe-inline', 'strict-dynamic', https:, data:… O botão Adicionar um nonce insere um nonce aleatório de 128 bits.
  4. Para permitir um script inline concreto sem 'unsafe-inline', cola-o (ou o HTML à volta dele) em Calcular o hash de um script ou estilo inline e clica em Calcular SHA-256 e adicionar.
  5. Marca upgrade-insecure-requests se alguns URL antigos ainda usam http:// e, se quiseres, indica um URL do endpoint de relatórios.
  6. Copia o Cabeçalho HTTP, o Cabeçalho Report-Only ou a Etiqueta HTML . A Análise desta política atualiza-se à medida que escreves.

Para auditar uma política que já tens, cola-a em Avaliar uma política existente e clica em Avaliar a política; Carregar no editor copia-a para os campos.

O que faz uma Content Security Policy

Uma CSP indica ao navegador de que origens uma página pode carregar scripts, estilos, imagens, tipos de letra, frames e ligações. A sua função principal é limitar o cross-site scripting (XSS): mesmo que um atacante consiga injetar código na tua página, uma boa política impede que o script injetado seja executado. Controla também quem pode incorporar a tua página num frame (frame-ancestors), para onde os formulários podem enviar dados (form-action) e para onde pode apontar a etiqueta <base> (base-uri).

As diretivas de obtenção, como img-src ou font-src, recorrem a default-src quando faltam. Já base-uri, form-action e frame-ancestors não têm esse recurso, e é por isso que a análise as pede explicitamente.

Nonces, hashes e strict-dynamic

Permitir anfitriões (script-src https://cdn.example.com) parece seguro, mas muitas vezes pode ser contornado: os grandes domínios alojam endpoints JSONP e bibliotecas antigas que um atacante pode reaproveitar. A abordagem recomendada pelas equipas de segurança dos navegadores é uma CSP estrita: cada <script> legítimo leva um nonce gerado pelo servidor em cada resposta, ou é permitido pelo seu hash, e 'strict-dynamic' deixa esses scripts de confiança carregar os scripts de que precisam. Nessa configuração, https: e 'unsafe-inline' servem apenas de recurso para navegadores muito antigos; os modernos ignoram-nos.

Um nonce só funciona se mudar em cada resposta e for imprevisível. O que é inserido por Adicionar um nonce é um exemplo: o teu servidor ou framework tem de gerar o seu próprio. Um hash abrange os bytes exatos do código inline, por isso reformatar o script obriga a calcular um novo hash.

Cabeçalho, Report-Only e etiqueta meta

Sempre que possível, envia a política como cabeçalho de resposta HTTP. Implementa-a primeiro como Content-Security-Policy-Report-Only: os navegadores comunicam as violações (na consola e no teu endpoint, se tiveres definido um) sem bloquear nada, para poderes corrigir as páginas antes de aplicar a política a sério. As definições de relatórios acrescentam report-uri para navegadores mais antigos e report-to com um cabeçalho Reporting-Endpoints.

A versão <meta http-equiv> dá jeito em alojamento estático, mas os navegadores ignoram nela frame-ancestors, report-uri, report-to e sandbox, e não existe etiqueta meta Report-Only. A ferramenta retira essas diretivas da etiqueta e avisa-te.

Perguntas frequentes

'unsafe-inline' em style-src é um problema?

É menos perigoso do que em script-src e muito comum, porque muitas bibliotecas definem estilos inline. Ainda assim, CSS injetado pode desfigurar uma página ou divulgar dados, por isso a análise assinala-o com gravidade baixa.

Os domínios do Google Analytics estão completos?

São exemplos tirados das orientações de CSP da Google para a etiqueta Google. A Google ajusta-os com o tempo e podem ser precisos domínios regionais; consulta a documentação atual da Google e remove o que não usas. O snippet inline do gtag.js também precisa de um nonce ou de um hash.

Porque é que a minha política bloqueia os meus próprios scripts inline?

Assim que script-src é definido sem 'unsafe-inline', todos os <script> inline e atributos onclick= ficam bloqueados. Passa o código para um ficheiro ou adiciona um nonce ou um hash.

Uma CSP substitui o escaping dos dados dos utilizadores?

Não. Uma CSP é uma segunda linha de defesa. Continua a fazer o escaping do que mostras e a validar o que recebes; a política limita os estragos quando algo escapa.

Posso ter várias políticas?

Sim: se uma página receber vários cabeçalhos CSP, cada recurso tem de cumprir todos eles. Cola uma política de cada vez no avaliador.