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 :
<script>alert('Foste pirateado!');</script>
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.



