Defaults.Exposed

Defaults.ExposedCorreções › Content-Security-Policy (CSP)

Como corrigir Content-Security-Policy (CSP)

Uma Política de Segurança de Conteúdo (CSP) é uma regra de segurança que o seu site entrega ao navegador de cada visitante, dizendo-lhe exatamente que código pode ser executado. Sem ela, se algo malicioso alguma vez chegar a uma página — por uma caixa de comentários, um plugin pirateado ou um script de terceiros — o navegador vai executá-lo livremente, incluindo código que recolhe em silêncio os números de cartão e palavras-passe dos seus clientes enquanto eles os escrevem, com o cadeado ainda visível.

O essencial para o seu negócio: Se o seu site for alguma vez adulterado, código malicioso pode ler os dados de cartão de pagamento e de login dos seus clientes diretamente do seu próprio checkout enquanto tudo parece completamente normal — deixando-o com estornos, queixas de fraude, uma violação de dados reportável e uma falha de verificação que as equipas de segurança de clientes maiores usam para estagnar ou matar um negócio.

Quanto isto lhe pode custar

Por que importa. O cadeado prova que a ligação ao seu site é privada, mas não faz nada para controlar que código corre depois de um visitante estar na página. Uma Política de Segurança de Conteúdo é a salvaguarda que o faz — diz aos navegadores para ignorarem qualquer script que não tenha vindo de uma fonte em que confia, para que um único campo, anúncio ou plugin adulterado não possa ser transformado numa ferramenta para roubar o dinheiro e os dados dos seus clientes. É uma verificação avaliada no seu boletim, vale pontos reais, e é uma das primeiras coisas que uma revisão de segurança profissional procura.

O que é isto, em palavras simples

Quando alguém visita o seu site, o navegador descarrega a sua página e executa o código que estiver nela — os scripts que fazem os menus descer, os botões funcionar, os formulários de pagamento submeter, e assim por diante. Por omissão, o navegador confia em tudo. Não tem forma de saber qual o código que é genuinamente seu e qual foi introduzido às escondidas por outra pessoa.

Uma Política de Segurança de Conteúdo (muitas vezes abreviada para CSP) é uma lista curta de regras que o seu site anexa a cada página, dizendo ao navegador: «só executa código destas fontes que aprovei, e recusa tudo o resto». É a diferença entre uma discoteca que deixa entrar qualquer um e uma com lista de convidados à porta.

A razão por que isto importa tanto é que os sites são adulterados constantemente — nem sempre piratear o seu servidor, mas pelas portas das traseiras que a maioria dos sites deixa abertas: um campo de comentários, uma caixa de pesquisa, um plugin desatualizado, um script de terceiros para anúncios ou estatísticas, ou um widget de chat. Se um atacante conseguir meter até uma única linha do código dele numa das suas páginas, o navegador executa-a como se fosse sua. A partir daí pode ler tudo o que os seus clientes escrevem — números de cartão, palavras-passe, moradas — e enviá-lo em silêncio para outro lado. Uma Política de Segurança de Conteúdo fecha essa porta ao recusar executar qualquer coisa de uma fonte que não aprovou.

Quanto isto lhe pode custar

Isto não é abstrato. O ataque que uma Política de Segurança de Conteúdo previne — código injetado numa página que rouba dados dos seus próprios clientes — está por trás de algumas das maiores violações de recolha de cartões alguma vez registadas. Eis como tende a desenrolar-se para uma empresa normal:

O que é na realidade (o detalhe)

Uma Política de Segurança de Conteúdo é entregue como um único cabeçalho de resposta HTTP — uma linha que o seu servidor web envia com cada página. O seu valor é um conjunto de diretivas, cada uma nomeando um tipo de conteúdo e as fontes permitidas para ele. Por exemplo:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

Em termos simples, isto diz: por omissão carrega só coisas do meu próprio site; executa só scripts do meu próprio site; não permite plugins de estilo antigo; e não deixa outros sites incorporarem o meu numa frame.

Como é o «bom». A nossa verificação não procura apenas a presença do cabeçalho — lê a política diretiva a diretiva e pontua quão forte ela realmente é, tal como faria um revisor de segurança. Uma política forte:

Uma política que existe mas se apoia em 'unsafe-inline', 'unsafe-eval' ou wildcards vai mesmo assim pontuar mal — porque, na prática, dá pouca proteção real. O objetivo é uma política apertada, não uma política qualquer.

Como corrigir (gratuito, ~1–2 horas)

Entregue isto ao seu técnico de TI ou a quem gere o seu site — a correção em si é completamente gratuita. Só cobramos para monitorizar que se mantém no lugar e correta ao longo do tempo; ligá-la não custa nada. A razão por que isto leva uma hora ou duas em vez de minutos é o passo cuidadoso do ensaio que impede que bloqueie acidentalmente partes do seu próprio site.

  1. Comece em modo só-relatório — não imponha ainda. Adicione um cabeçalho de resposta Content-Security-Policy-Report-Only. Isto observa e regista o que seria bloqueado sem de facto bloquear nada, para que o site em direto continue a funcionar enquanto aprende de que cada página genuinamente depende. (Importante: o só-relatório por si só não dá proteção nenhuma aos visitantes — é apenas o primeiro passo seguro.)

  2. Construa a política a partir do que o seu site de facto usa. Reveja os relatórios para encontrar todas as fontes legítimas de scripts, estilos, tipos de letra e imagens — o seu próprio domínio, as suas estatísticas, o seu fornecedor de pagamentos, o seu host de tipos de letra, o seu widget de chat — e liste-as como fontes permitidas. Um bom ponto de partida é default-src 'self' mais entradas explícitas para os terceiros de confiança que realmente usa.

  3. Evite as brechas que derrotam todo o objetivo. Afaste-se de 'unsafe-inline' e 'unsafe-eval' para scripts, e evite fontes com wildcard como * e esquemas simples como https: para scripts — estas reabrem exatamente a brecha que a política deve fechar. Onde scripts inline são inevitáveis, use um nonce ou hash para que só corra o seu código específico aprovado.

  4. Tranque o enquadramento e os plugins. Adicione frame-ancestors 'self' (isto também impede outros sites de incorporarem o seu para enganar os seus clientes, e satisfaz a verificação relacionada de clickjacking) e object-src 'none' para bloquear ataques baseados em plugins antigos.

  5. Mude de só-relatório para imposição. Quando os relatórios estiverem limpos e o site funcionar, mude o nome do cabeçalho de Content-Security-Policy-Report-Only para Content-Security-Policy. Este é o passo que de facto entrega proteção — uma política só-relatório sozinha não a dá, e não vai passar a verificação.

    Onde define o cabeçalho depende da sua plataforma:

    • Cloudflare: Rules → Transform Rules → Modify Response Header → defina Content-Security-Policy. (Pode usar a Cloudflare também para o ensaio só-relatório.)
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
    • IIS (web.config): adicione um cabeçalho de resposta HTTP personalizado chamado Content-Security-Policy com a política como valor.
    • Google Workspace / Microsoft 365: estes correm o seu e-mail, não o seu site público, por isso a política é definida onde quer que o seu site esteja realmente alojado (a Cloudflare ou o seu alojamento web acima), não na consola de administração do seu e-mail.
  6. Volte a verificar o seu domínio para confirmar que a política aparece agora como ligada e em imposição, sem brechas que a enfraqueçam.

Erros comuns

Perguntas frequentes

Não percebo de informática — consigo resolver isto sozinho?

Não precisa de perceber os detalhes. Esta é uma definição adicionada por quem gere o seu site ou alojamento, e em serviços como a Cloudflare é em grande parte guiada. Entregue-lhes a secção «Como corrigir» abaixo. É gratuito; a única cautela é que deve ser implementada com cuidado, primeiro num ensaio só-de-observação, para não bloquear acidentalmente partes do seu próprio site — que é exatamente o que os passos cobrem.

Já tenho o cadeado e um certificado SSL — o meu site não está seguro?

O cadeado protege a entrega da sua página; não policia o que corre lá dentro. Se código malicioso alguma vez acabar numa página — via um plugin pirateado, um anúncio comprometido ou um campo injetado — o cadeado não o impede de roubar dados. Uma Política de Segurança de Conteúdo é a camada que limita o que pode correr, em primeiro lugar. Protegem coisas diferentes, e quer ambas.

Ligar isto pode estragar o meu site?

Pode, se for ligado de forma agressiva tudo de uma vez, porque pode bloquear scripts legítimos que de facto usa. É por isso que a abordagem padrão é começar num modo de ensaio «só-relatório» que observa sem bloquear, corrigir tudo o que sinaliza e só depois impô-lo. Feito desta forma é seguro — e o passo do ensaio está integrado na correção abaixo.

Já o pusemos em modo «só-relatório» — estamos cobertos?

Não, e esta é a falsa sensação de segurança mais comum. O modo só-relatório observa e regista o que seria bloqueado, mas não bloqueia nada — os visitantes têm zero proteção real. É apenas o primeiro passo seguro. A nossa verificação dá ao só-relatório uma pequena fração do crédito de uma política real e não a registará como passagem. Só está protegido depois de mudar para o modo de imposição.

Isto afeta a nossa nota, ou é só consultivo?

Afeta a sua nota. A verificação da Política de Segurança de Conteúdo é avaliada e vale até 25 pontos na categoria de Segurança Web. Uma política em falta ou fraca é marcada como severidade alta e puxa a sua nota para baixo — e é exatamente o tipo de falha que o questionário de segurança de um cliente pergunta.

O nosso programador adicionou uma política mas a pontuação continua baixa — porquê?

Uma política pode existir e mesmo assim ser fraca. Os culpados mais comuns são brechas como «unsafe-inline» e «unsafe-eval» para scripts, ou fontes com wildcard (um simples *), que reabrem exatamente a brecha que a política deve fechar. A nossa verificação lê a política diretiva a diretiva e pontua para baixo essas fraquezas — uma política que permite tudo pontua pouco melhor do que não ter nenhuma. A correção é apertar as regras de scripts usando nonces ou hashes em vez dessas brechas.