Introdução

No mundo digital de hoje, a segurança do site é fundamental. Uma das melhores práticas para reforçar esta segurança é a utilização de uma Política de Segurança de Conteúdos (CSP). Mas o que é exatamente uma CSP e porque é tão importante?

O que é uma política de segurança de conteúdos?

Uma Política de Segurança de Conteúdos é um mecanismo de segurança que permite aos proprietários de sítios Web controlar com precisão os recursos que podem ser carregados e executados nas suas páginas. Por outras palavras, é como um guardião que decide que conteúdo é permitido no teu site.

Porquê adicionar CSPs?

Sem o CSP, o teu site é mais vulnerável a vários ataques, incluindo :

  • Cross-Site Scripting (XSS): Os atacantes podem injetar scripts maliciosos nas tuas páginas.
  • Injeção de dados : Podem ser inseridos conteúdos não autorizados no teu sítio.
  • Clickjacking : O teu site pode ser publicado noutro site malicioso para enganar os utilizadores.

Estas vulnerabilidades podem levar ao roubo de dados sensíveis, à manipulação do conteúdo do teu site ou mesmo à distribuição de malware.

XSS (Cross-Site Scripting)

Risco : Um atacante injeta um script malicioso no teu site para roubar informações sensíveis ou manipular o comportamento da tua aplicação.

Exemplo : Suponha que o seu site permite aos utilizadores publicar mensagens utilizando etiquetas HTML. Se um atacante publicar uma mensagem que contenha um script malicioso da seguinte forma :

Se o teu site não tiver um CSP ou se autorizar scripts em linha através de unsafe-inline, este script será executado pelo browser dos utilizadores que visitam a página, permitindo ao atacante executar código arbitrário.

Com CSPs : Utiliza nonces ou hashes para autorizar apenas scripts legítimos.

Injeção de dados

Risco: Podem ser inseridos conteúdos não autorizados no teu sítio, alterando o seu comportamento ou aspeto.

Exemplo : Um atacante injecta uma etiqueta <style> para modificar o aspeto do teu sítio ou uma etiqueta <img> para mostrar imagens não autorizadas.

Com os PSC : Limita as fontes autorizadas de estilos e imagens.

Content-Security-Policy: style-src 'self'; img-src 'self' https://trusted-cdn.com; 

Clickjacking

Risco : Um atacante sobrepõe uma camada invisível do seu site ao teu para enganar os utilizadores e levá-los a realizar acções não intencionais.

Exemplo : Um atacante integra o teu site numa iframe (visível) e sobrepõe o seu próprio conteúdo. Quando um utilizador clica nesta página, fica com a impressão de que está a clicar num botão do teu sítio, mas na realidade está a clicar no sítio do atacante.

Mitigação com CSP : Utiliza o cabeçalho Content-Security-Policy com a diretiva frame-ancestors para controlar quem pode incorporar o teu site numa iframe.

Content-Security-Policy: frame-ancestors 'self'; 

Como implementar um CSP de forma eficaz

A criação de uma SSC pode parecer complexa, mas eis os passos essenciais:

  • Define a tua política: Começa por identificar as fontes de conteúdo legítimas para o teu site.
  • Utilizar o modo de relatório: Antes de aplicar estritamente o seu CSP, utiliza o cabeçalho Content-Security-Policy-Report-Only para identificar potenciais problemas sem bloquear o conteúdo.
  • Aplicar a política : Quando tiveres a certeza de que o teu CSP não interfere com o funcionamento normal do teu site, implementa-o através do cabeçalho HTTP Content-Security-Policy.
  • Aperfeiçoa gradualmente: Começa com uma política de base e reforça-a gradualmente.

Segue-se um exemplo de um SSC básico:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; 

Esta política permite que os recursos sejam carregados apenas a partir do teu próprio domínio, com scripts adicionais autorizados a partir de uma CDN de confiança.

Comparação das diretivas CPE

Quando configuras um CSP, tens várias opções para especificar as fontes autorizadas. Segue-se uma breve comparação de algumas das diretivas mais comuns:

  • Nonce : Um nonce é um token aleatório gerado para cada pedido. É utilizado para autorizar scripts em linha , evitando ataques XSS. O nonce deve ser incluído no script e na política CSP.
  • Hash : Um hash é uma impressão digital única gerada a partir do conteúdo de um script. Pode ser utilizado para autorizar scripts em linha específicos sem comprometer a segurança.
  • Domínio : Especificar um domínio (por exemplo, https://example.com) autoriza o carregamento de recursos a partir desse domínio.
  • self’ : Esta diretiva é utilizada para carregar recursos do mesmo domínio que o site atual.
  • unsafe’ : Diretivas como unsafe-inline ou unsafe-eval permitem a execução de scripts inline ou a utilização de eval(), respetivamente, mas enfraquecem consideravelmente a segurança do teu site.

Categorias de configuração CSP

Segue-se uma lista das principais categorias de configuração CSP e das suas funções:

  • default-src : Define a fonte padrão para todos os tipos de recursos se não forem explicitamente especificados.
  • script-src : Controla as fontes autorizadas para scripts.
  • style-src: Controla as fontes autorizadas para folhas de estilo.
  • img-src : Controla as fontes autorizadas para as imagens.
  • font-src : Controla as fontes autorizadas para os tipos de letra.
  • connect-src : Controla as fontes autorizadas para pedidos XHR e WebSocket.
  • frame-src: Controla as fontes autorizadas para iframes.
  • child-src : Controla as fontes autorizadas para iframes e web workers.
  • object-src : Controla as fontes autorizadas para objectos incorporados.
  • media-src : Controla as fontes autorizadas para os média (vídeo, áudio).
  • frame-ancestors : Controlo que pode integrar o teu site num iframe.

Detalhes de nonces e hashes

Nonces

Um nonce é um token aleatório gerado para cada pedido. Vê como funciona:

  • Geração de nonce : O servidor gera um nonce aleatório para cada página carregada.
  • Inclusão no script : O nonce é incluído em cada script em linha como um atributo.
  • Definição no CSP: O mesmo nonce é especificado na política do CSP para autorizar estes scripts.

Exemplo de código com um nonce :

<script nonce="random_nonce_value">...</script> 

E no PEC :

Content-Security-Policy: script-src 'self' 'nonce-random_nonce_value'; 

Hashes

Um hash é uma impressão digital única gerada a partir do conteúdo de um script. Tem em atenção que se o teu script mudar, o hash também muda. Vê como funciona:

  • Geração de hash: Um hash é gerado a partir do conteúdo de um script em linha.
  • Inclusão no CSP : O hash é especificado na política do CSP para autorizar este script.

Exemplo de código com um hash :

<script>console.log('Hello World!');</script> 

O hash SHA-256 deste script é sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=. No CSP :

Content-Security-Policy: script-src 'self' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU='; 

Ser alertado em caso de problema

É crucial saber quando o teu CSP está a bloquear recursos. Para isso, podes configurar a diretiva report-to (que substitui report-uri, embora esta última ainda seja suportada para compatibilidade com navegadores mais antigos). Esta diretiva envia relatórios JSON para um URL especificado sempre que um recurso é bloqueado pelo seu CSP.

Configura o cabeçalho Reporting-Endpoints :

Define um cabeçalho Reporting-Endpoints que especifica os endpoints para o envio de relatórios.

Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"

Utiliza o report-to no CSP :

Especifica o nome do grupo de relatórios no teu CSP.

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; report-to csp-endpoint; 

Configura um ponto final de relatório :

Configura um ponto final no seu servidor (por exemplo, /csp-report-endpoint) para receber e processar relatórios JSON.

Melhores práticas para uma SSC sólida

  • Evita diretivas “inseguras”: Não utilizes unsafe-inline ou unsafe-eval a não ser que seja absolutamente necessário.
  • Utiliza nonces ou hashes para scripts em linha inevitáveis.
  • Limita a utilização de wildcards (*), que podem enfraquecer a tua política.
  • Testa regularmente o teu CSP utilizando ferramentas como o Google’s CSP Evaluator ou configura um Report-To.

Conclusão

A implementação de uma política de segurança de conteúdos é um passo crucial para proteger o teu sítio Web. Embora possa parecer complexo no início, as vantagens em termos de segurança são consideráveis. Se seguires as melhores práticas e aperfeiçoares gradualmente a tua política, podes reduzir significativamente o risco de ataques e proteger os teus utilizadores e dados.

Não te esqueças de que a segurança da Web é um processo contínuo. Mantém-te atualizado com as últimas recomendações do CSP e ajusta a tua política em conformidade. O teu site será ainda mais seguro e fiável por isso.