Estamos experimentando con una nueva CSP ‘strict-dynamic’, que debería facilitar la integración segura de temas, plugins y scripts externos con Discourse.
Puedes probar el nuevo modo habilitando la configuración del sitio ‘content security policy strict dynamic’. ¡Por favor, haznos saber si tienes algún comentario!
Esperamos que esto se convierta en el valor predeterminado en un futuro próximo, y publicaremos un tema de Announcements a medida que nos acerquemos a ese objetivo.
Para más información, consulta a continuación:
Antecedentes
En 2018 introdujimos una Política de Seguridad de Contenido predeterminada para Discourse. En ese momento, nuestra política de soporte de navegador significaba que estábamos limitados a usar valores ‘host-source’ (es decir, listar prefijos de URL para cada script que debería permitirse).
Aquí en 2024, hay más opciones disponibles: a saber, la palabra clave 'strict-dynamic'. Esto elimina la necesidad de listar todas las URL de scripts con anticipación. En cambio, cualquier script inicialmente confiable (a través de un valor ‘hash’ o ‘nonce’) puede cargar más scripts con restricciones mínimas.
¿Cómo pruebo este nuevo modo?
Habilita la configuración ‘content security policy strict dynamic’ en tu panel de administración.
Si no ves la configuración, asegúrate de estar ejecutando la última versión de Discourse. La nueva función se fusionó el 16 de febrero (durante el ciclo 3.3.0.beta1-dev).
Si estás en nuestro hosting y deseas acelerar la actualización, ¡simplemente háznoslo saber!
¿Qué sucede cuando habilito la nueva configuración?
La directiva script-src de Content-Security-Policy se actualizará para incluir un único valor nonce- y la palabra clave 'strict-dynamic'.
Todas las etiquetas \u003cscript\u003e iniciales en el núcleo y en los temas recibirán automáticamente el atributo nonce= apropiado. No se requiere ningún trabajo adicional por parte de los administradores o desarrolladores de temas.
Los plugins que inyectan sus propias etiquetas \u003cscript\u003e personalizadas deberán actualizarse para admitir este nuevo modo (por ejemplo). Estamos trabajando para recopilar datos sobre qué tan extendido está esto y proporcionaremos orientación a los desarrolladores si es necesario.
Cualquier valor de host-source que los temas o plugins estén contribuyendo será ignorado automáticamente (los navegadores no admiten host-source junto con strict-dynamic).
¿Qué pasa con los scripts externos como GTM, análisis, publicidad, etc.?
Deberían funcionar ‘sin problemas’, sin necesidad de configuración adicional. ¡Háznoslo saber si encuentras algún problema!
¿Es reversible?
¡Sí! Mientras ejecutamos el experimento, puedes activar y desactivar la configuración y el cambio se hará efectivo de inmediato.
Políticas de ejemplo
Ejemplo de política de Discourse antes de este cambio:
upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src https://meta.discourse.org/logs/ https://meta.discourse.org/sidekiq/ https://meta.discourse.org/mini-profiler-resources/ https://d11a6trkgmumsb.cloudfront.net/assets/ https://meta.discourse.org/extra-locales/ https://d3bpeqsaub0i6y.cloudfront.net/highlight-js/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/ https://d3bpeqsaub0i6y.cloudfront.net/theme-javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/svg-sprite/ 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0=' 'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=';
worker-src 'self' https://d11a6trkgmumsb.cloudfront.net/assets/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/;
frame-ancestors 'self';
manifest-src 'self';
Ejemplo de política de Discourse después de este cambio:
upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src 'nonce-78uQrKOCg78iGuMAwCq2lI9E7' 'strict-dynamic';
frame-ancestors 'self';
manifest-src 'self';
Recursos
Documentación de MDN sobre strict-dynamic