Mitigue ataques XSS com Content Security Policy

:bookmark: Este guia explica como usar a Política de Segurança de Conteúdo (CSP) para mitigar ataques de Cross-Site Scripting (XSS) no Discourse. Ele aborda os fundamentos da CSP, configuração e melhores práticas.

:person_raising_hand: Nível de usuário necessário: Administrador

Resumo

A Política de Segurança de Conteúdo (CSP) é um recurso de segurança crucial no Discourse que ajuda a proteger contra Cross-Site Scripting (XSS) e outros ataques de injeção. Este guia cobre os fundamentos da CSP, como ela é implementada no Discourse e como configurá-la para o seu site.

O que é a Política de Segurança de Conteúdo?

A Política de Segurança de Conteúdo é uma camada adicional de segurança que ajuda a detectar e mitigar certos tipos de ataques, incluindo Cross-Site Scripting (XSS) e ataques de injeção de dados. A CSP funciona especificando quais fontes de conteúdo são consideradas confiáveis e instruindo o navegador a executar ou renderizar recursos apenas dessas fontes confiáveis.

O XSS continua sendo uma das vulnerabilidades web mais comuns. Ao implementar a CSP, o Discourse permite que apenas scripts de fontes confiáveis sejam carregados e executados, reduzindo significativamente o risco de ataques XSS.

Implementação da CSP no Discourse

A partir da versão 3.3.0.beta1 do Discourse, o sistema implementa uma CSP do tipo ‘strict-dynamic’. Essa abordagem utiliza um único valor nonce- e a palavra-chave strict-dynamic na diretiva script-src. Todas as tags \u003cscript\u003e iniciais no núcleo e nos temas recebem automaticamente o atributo nonce= apropriado.

A política padrão inclui as seguintes diretivas:

  • script-src: Especifica fontes válidas para JavaScripts
  • worker-src: Especifica fontes válidas para scripts ServiceWorker
  • object-src: Bloqueia a execução de plugins (Flash, Java, etc.)
  • base-uri: Restringe as URLs para elementos \u003cbase\u003e
  • manifest-src: Restringe as URLs para manifestos de aplicativos web
  • frame-ancestors: Controla quais sites podem incorporar sua instância do Discourse em um iframe
  • upgrade-insecure-requests: Atualiza automaticamente solicitações HTTP para HTTPS (incluído quando force_https está ativado)

Configurando a CSP no Discourse

Configurações disponíveis

  • content_security_policy: Ativa ou desativa a CSP (padrão: ligado)
  • content_security_policy_report_only: Ativa o modo CSP Report-Only (padrão: desligado)
  • content_security_policy_script_src: Permite estender a diretiva script-src padrão
  • content_security_policy_frame_ancestors: Ativa a diretiva frame_ancestors (padrão: ligado)

Como ativar a CSP

  1. Acesse seu painel de Administração
  2. Vá para as configurações de Segurança
  3. Encontre a configuração content_security_policy e certifique-se de que está ativada

Recomenda-se começar com o modo CSP Report-Only para identificar possíveis problemas antes de ativar completamente a CSP:

  1. Ative a configuração content_security_policy_report_only
  2. Monitore o console do navegador para violações da CSP
  3. Resolva quaisquer violações legítimas estendendo a CSP conforme necessário
  4. Assim que tiver certeza de que não há falsos positivos, desative o modo Report-Only e ative completamente a CSP

Estendendo a CSP padrão

Se precisar permitir fontes de script adicionais, você pode estender a diretiva script-src usando a configuração content_security_policy_script_src. Você pode adicionar:

  • Fontes baseadas em hash
  • 'wasm-unsafe-eval'
  • 'unsafe-eval' (use com cautela)

Por exemplo:

'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=' 'unsafe-eval'

:warning: Tenha cuidado ao adicionar 'unsafe-eval' ou outras diretivas permissivas, pois elas podem reduzir a eficácia da CSP.

CSP e integrações de terceiros

Ao usar serviços de terceiros como Google Tag Manager, Google Analytics ou serviços de publicidade, talvez seja necessário ajustar suas configurações de CSP. Na maioria dos casos com o Discourse versão 3.3.0.beta1 ou posterior, scripts externos devem funcionar sem configuração adicional devido à implementação da CSP ‘strict-dynamic’.

Se encontrar problemas, talvez seja necessário:

  1. Identificar as fontes de script necessárias monitorando o console do navegador
  2. Adicionar as fontes necessárias à configuração content_security_policy_script_src
  3. Para integrações complexas como serviços de publicidade que carregam recursos externos, talvez seja necessário ativar a renderização entre domínios (Exemplo de PR do discourse-adplugin que faz isso).

Melhores práticas

  1. Comece com o modo CSP Report-Only para identificar possíveis problemas
  2. Aperte gradualmente sua CSP à medida que resolve violações legítimas
  3. Revise regularmente suas configurações de CSP e ajuste conforme necessário
  4. Tenha cuidado ao adicionar diretivas permissivas como 'unsafe-eval' ou 'wasm-unsafe-eval'
  5. Mantenha sua instância do Discourse atualizada para se beneficiar das últimas melhorias da CSP

Perguntas frequentes (FAQs)

P: Estou vendo muitos relatórios de violação da CSP. Devo me preocupar?
R: Muitas violações da CSP são falsos positivos, frequentemente causados por extensões do navegador ou outros scripts não relacionados. Foque em resolver violações relacionadas à funcionalidade do seu site.

P: Posso usar a CSP com o Google AdSense ou outras redes de anúncios?
R: Sim, mas talvez seja necessário usar configurações de CSP mais permissivas. Comece com o modo Report-Only e ajuste suas configurações com base nas violações relatadas.

P: Como soluciono problemas relacionados à CSP?
R: Use as ferramentas de desenvolvedor do seu navegador para monitorar o console em busca de mensagens de violação da CSP. Elas ajudarão a identificar quais recursos estão sendo bloqueados e o motivo.

Recursos adicionais

56 curtidas
Adsense Not Working after Recent Discourse Update
Discourse 2.2.0.beta6 Release Notes
Adding statcounter code
How to restart Discourse after server reboot?
How to install npm packages in custom themes/plugins
Interactive SVG using <object>?
Video Upload to YouTube and Vimeo using Theme Component
Embed HTML5 player for MP3 file
2.5.0.beta5 breaks retort plugin
Should I load third-party libraries from vendor or cdn?
Word Cloud plugin
Embed widget within text in a topic
Discourse Intercom (Advanced)
"Unsafe JavaScript attempt to initiate navigation"
Google Tag Manager and Discourse CSP (Content Security Policy)
Cookie Consent, GDPR, and Discourse
A strange question about google ad display in my site
How to pass a component setting as a value to an attribute?
Need help integrating code wrote on Edittext to the Discourse
Issue with Activate Account Page After Update to 3.4.0 (Blank Page)
Any approved method for adding Javascript before body close?
(Superseded) Experimenting with a 'strict-dynamic' Content Security Policy (CSP)
Can't get script tag to work in landing pages plugin due to content-security-policy
How to embed Razorpay subscription button with CSP restrictions
Push custom events to Google Tag Manager and Analytics
Can I add a snippet to the header?
JS script is not loading
How do we fire scripts after topic HTML is rendered in DOM?
Iframe issue without URL
Where to place ad script?
We couldn't find the code on your site
Javascript not working in customised areas
Difficulties in correctly adding external JavaScript
Report Only CSP Violations
Nginx config in Discourse Docker?
EPN Smart Links
Discourse 2.2.0.beta9 Release Notes
"Refused to load the script" when adding adsense
Why Cookie Consent Doesn't Show Up?
[DigitalOcean] hostname having "www" in A records showing blank page
[DigitalOcean] hostname having "www" in A records showing blank page
Communities with embedded Twitter Feeds
How to add analytics and pixel scripts avoiding Content Security Policy (XSS)
When install html script facing issue?
Discourse 2.4.0.beta10 Release Notes
Add CSP sources to the plugin
IP does not redirect to domain, domain shows white page
DISCOURSE_CDN_URL causes content security policy violations?
Header content is missing due to CSP
How to insert something right after <head>?
How can I embed tracking JS into Discourse
How do I integrate ? cookiebot.com in meinen Forum?
Adding Cookie Consent Banner
Confused about remotely loaded javascript content
User input validation
Custom JS script in theme component not loading