
Conhecendo Content Security Policy (CSP)
A segurança na web é uma preocupação constante. Todos os dias, milhares de sites são comprometidos por ataques como Cross-Site Scripting (XSS), permitindo que invasores executem scripts maliciosos em páginas legítimas.
Imagine um cenário onde um usuário acessa um site confiável, mas um script injetado rouba seus dados de login e os envia para um atacante. Infelizmente, esse tipo de ataque ainda é comum e pode ter consequências graves.
Uma forma eficaz de mitigar ataques XSS e proteger aplicações web é a implementação do Content Security Policy (CSP).
O que é XSS?
XSS ou Cross site Scripting é um tipo de vulnerabilidade de segurança em aplicações web que permite a injeção de scripts maliciosos em páginas visualizadas por outros usuários. Esses scripts podem roubar informações sensíveis, como cookies de sessão, redirecionar usuários para sites maliciosos, modificar o conteúdo da página e até mesmo realizar ações em nome do usuário sem seu consentimento.
O que é CSP?
Content Security Policy (CSP) é um recurso de segurança essencial que ajuda a prevenir vários tipos de ataques, como Cross-Site Scripting (XSS) e ataques de injeção de dados. Ao definir um conjunto de regras de segurança para aplicativos web, o CSP restringe as fontes de onde o conteúdo pode ser carregado, reduzindo o risco de execução de código malicioso.
CSP é um cabeçalho de resposta HTTP ou uma meta tag que define quais recursos podem ser carregados e executados dentro de uma página da web. Ele funciona como um mecanismo de segurança baseado em lista de permissões, garantindo que apenas scripts, estilos, imagens e outros recursos explicitamente permitidos sejam carregados.
Principais características do CSP
- Mitigação contra ataques XSS: Impede a execução de scripts não autorizados.
- Controle sobre o carregamento de recursos: Limita as fontes de onde scripts, imagens e outros ativos podem ser carregados.
- Prevenção de ataques de injeção de dados: Bloqueia a injeção e execução de código malicioso no navegador.
- Redução da superfície de ataque: Ajuda a impor boas práticas de segurança, limitando dependências externas.
Como implementar CSP?
O CSP pode ser implementado adicionando um cabeçalho HTTP Content-Security-Policy
na configuração do servidor web ou através de uma <meta>
tag diretamente no HTML.
Exemplo via tag meta
Pode se definir a CSP diretamente no HTML dessa forma:
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-inline' https://apis.google.com;"
/>
Desmembrando as Definições
http-equiv="Content-Security-Policy"
- Indica que esta meta tag define uma Política de Segurança de Conteúdo (CSP).
content="..."
(Diretivas da CSP)
O atributo content
contém regras de segurança que controlam o carregamento de recursos na página. Vamos analisá-las em detalhe:
default-src 'self'
- Define a origem padrão para o carregamento de recursos, como scripts, estilos e imagens.
- O valor
'self'
permite apenas recursos provenientes do mesmo domínio da página.
script-src 'self' 'unsafe-inline' https://apis.google.com;
- Especifica de onde os scripts podem ser carregados.
'self'
restringe o carregamento de scripts ao próprio domínio.'unsafe-inline'
permite a execução de scripts inline, como<script>alert('Hello')</script>
, o que pode representar um risco de segurança.https://apis.google.com
autoriza scripts carregados especificamente desse domínio externo.
Exemplo mais seguro com tag meta
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'nonce-abcdef'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
/>
Explicação das mudanças
'nonce-abcdef'
noscript-src
- Permite apenas scripts que tenham um
nonce
correspondente, evitando execução de scripts injetados. - Exemplo de uso:
<script nonce="abcdef"> console.log("Safe script"); </script>
- Permite apenas scripts que tenham um
'unsafe-inline'
nostyle-src
- Permite estilos inline (
<style>...</style>
oustyle=""
em elementos).
- Permite estilos inline (
img-src 'self' data:
- Permite imagens do próprio domínio e imagens embutidas em
data:
(Base64).
- Permite imagens do próprio domínio e imagens embutidas em
Limitações do <meta>
- Não pode controlar
frame-ancestors
(proteção contraclickjacking
). - Algumas políticas avançadas, como
upgrade-insecure-requests
, não funcionam corretamente. - O cabeçalho HTTP oferece maior controle e proteção.
Exemplo de cabeçalho CSP
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-scripts.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:
Esse cabeçalho pode ser implementado no backend ou até diretamente em um servidor web como NGINX, onde conseguimos as vantagens da meta tag e mais flexibilidade caso haja a necessidade de múltiplas definições.
Conclusão
O CSP é uma ferramenta poderosa para melhorar a segurança de aplicativos web. Ao aprender e implementar o CSP de maneira eficaz, os desenvolvedores podem proteger os usuários contra ameaças de segurança comuns, garantir conformidade com padrões de segurança e criar aplicativos web mais resilientes. Com a abordagem certa, o CSP pode melhorar significativamente a postura geral de segurança de qualquer projeto web.
Observação importante: Não se trata de um conteúdo elaborado por um especialista em segurança, sendo uma tentativa de aprofundamento no tema. Caso sejam identificados pontos de melhoria, comentários construtivos são bem-vindos.