Esta guía explica cómo utilizar la Política de Seguridad de Contenido (CSP) para mitigar los ataques de Cross-Site Scripting (XSS) en Discourse. Cubre los conceptos básicos de CSP, su configuración y las mejores prácticas.
Nivel de usuario requerido: Administrador
Resumen
La Política de Seguridad de Contenido (CSP) es una función de seguridad crucial en Discourse que ayuda a proteger contra ataques de Cross-Site Scripting (XSS) y otras inyecciones. Esta guía cubre los fundamentos de CSP, cómo se implementa en Discourse y cómo configurarla para tu sitio.
¿Qué es la Política de Seguridad de Contenido?
La Política de Seguridad de Contenido es una capa adicional de seguridad que ayuda a detectar y mitigar ciertos tipos de ataques, incluidos los ataques de Cross-Site Scripting (XSS) y las inyecciones de datos. CSP funciona especificando qué fuentes de contenido se consideran de confianza e instruyendo al navegador para que solo ejecute o renderice recursos desde esas fuentes confiables.
El XSS sigue siendo una de las vulnerabilidades web más comunes. Al implementar CSP, Discourse permite que solo los scripts de fuentes confiables se carguen y ejecuten, reduciendo significativamente el riesgo de ataques XSS.
Implementación de CSP en Discourse
A partir de la versión 3.3.0.beta1 de Discourse, esta plataforma implementa una CSP de ‘strict-dynamic’. Este enfoque utiliza un único valor nonce- y la palabra clave strict-dynamic en la directiva script-src. Todas las etiquetas \u003cscript\u003e iniciales en el núcleo y los temas reciben automáticamente el atributo nonce= apropiado.
La política predeterminada incluye las siguientes directivas:
script-src: Especifica las fuentes válidas para JavaScript.worker-src: Especifica las fuentes válidas para los scripts de ServiceWorker.object-src: Bloquea la ejecución de plugins (Flash, Java, etc.).base-uri: Restringe las URL para los elementos\u003cbase\u003e.manifest-src: Restringe las URL para los manifiestos de aplicaciones web.frame-ancestors: Controla qué sitios pueden incrustar tu instancia de Discourse en un iframe.upgrade-insecure-requests: Actualiza automáticamente las solicitudes HTTP a HTTPS (incluido cuandoforce_httpsestá habilitado).
Configuración de CSP en Discourse
Configuraciones disponibles
content_security_policy: Habilita o deshabilita CSP (predeterminado: on).content_security_policy_report_only: Habilita el modo CSP Report-Only (predeterminado: off).content_security_policy_script_src: Te permite extender la directivascript-srcpredeterminada.content_security_policy_frame_ancestors: Habilita la directivaframe_ancestors(predeterminado: on).
Cómo habilitar CSP
- Navega a tu panel de Administración.
- Ve a la configuración de Seguridad.
- Busca la configuración
content_security_policyy asegúrate de que esté habilitada.
Se recomienda comenzar con el modo CSP Report-Only para identificar posibles problemas antes de habilitar CSP completamente:
- Habilita la configuración
content_security_policy_report_only. - Monitorea la consola de tu navegador en busca de violaciones de CSP.
- Aborda cualquier violación legítima extendiendo la CSP según sea necesario.
- Una vez que estés seguro de que no hay falsos positivos, deshabilita el modo Report-Only y habilita CSP completamente.
Extender la CSP predeterminada
Si necesitas permitir fuentes de scripts adicionales, puedes extender la directiva script-src utilizando la configuración content_security_policy_script_src. Puedes agregar:
- Fuentes basadas en hash.
'wasm-unsafe-eval'.'unsafe-eval'(úsalo con precaución).
Por ejemplo:
'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=' 'unsafe-eval'
Ten cuidado al agregar 'unsafe-eval' u otras directivas permisivas, ya que pueden reducir la efectividad de CSP.
CSP e integraciones de terceros
Al utilizar servicios de terceros como Google Tag Manager, Google Analytics o servicios de publicidad, es posible que debas ajustar tu configuración de CSP. En la mayoría de los casos con Discourse versión 3.3.0.beta1 o posterior, los scripts externos deberían funcionar sin configuración adicional debido a la implementación de CSP de ‘strict-dynamic’.
Si encuentras problemas, es posible que debas:
- Identificar las fuentes de scripts necesarias monitoreando la consola de tu navegador.
- Agregar las fuentes necesarias a la configuración
content_security_policy_script_src. - Para integraciones complejas como servicios de publicidad que cargan recursos externos, es posible que debas habilitar la renderización entre dominios (Ejemplo de PR de discourse-adplugin que hace esto).
Mejores prácticas
- Comienza con el modo CSP Report-Only para identificar posibles problemas.
- Ajusta progresivamente tu CSP a medida que resuelves las violaciones legítimas.
- Revisa regularmente tu configuración de CSP y ajústala según sea necesario.
- Ten cuidado al agregar directivas permisivas como
'unsafe-eval'o'wasm-unsafe-eval'. - Mantén tu instancia de Discourse actualizada para beneficiarte de las últimas mejoras de CSP.
Preguntas frecuentes
P: Estoy viendo muchos informes de violaciones de CSP. ¿Debería preocuparme?
R: Muchas violaciones de CSP son falsos positivos, a menudo causados por extensiones del navegador u otros scripts no relacionados. Concéntrate en abordar las violaciones relacionadas con la funcionalidad de tu sitio.
P: ¿Puedo usar CSP con Google AdSense u otras redes publicitarias?
R: Sí, pero es posible que debas usar configuraciones de CSP más permisivas. Comienza con el modo Report-Only y ajusta tu configuración en función de las violaciones reportadas.
P: ¿Cómo soluciono problemas de CSP?
R: Utiliza las herramientas de desarrollador de tu navegador para monitorear la consola en busca de mensajes de violación de CSP. Estos te ayudarán a identificar qué recursos están siendo bloqueados y por qué.







