Atténuer les attaques XSS avec la Content Security Policy

:bookmark: Ce guide explique comment utiliser la Politique de Sécurité du Contenu (CSP) pour atténuer les attaques de type Cross-Site Scripting (XSS) dans Discourse. Il couvre les bases de la CSP, sa configuration et les meilleures pratiques.

:person_raising_hand: Niveau d’utilisateur requis : Administrateur

Résumé

La Politique de Sécurité du Contenu (CSP) est une fonctionnalité de sécurité cruciale dans Discourse qui aide à se protéger contre les attaques de type Cross-Site Scripting (XSS) et autres attaques par injection. Ce guide présente les bases de la CSP, son implémentation dans Discourse et la façon de la configurer pour votre site.

Qu’est-ce que la Politique de Sécurité du Contenu ?

La Politique de Sécurité du Contenu est une couche de sécurité supplémentaire qui aide à détecter et à atténuer certains types d’attaques, notamment les attaques de type Cross-Site Scripting (XSS) et les attaques par injection de données. La CSP fonctionne en spécifiant quelles sources de contenu sont considérées comme fiables et en instruisant le navigateur à n’exécuter ou à rendre que les ressources provenant de ces sources fiables.

Le XSS reste l’une des vulnérabilités web les plus courantes. En mettant en œuvre la CSP, Discourse autorise uniquement le chargement et l’exécution de scripts provenant de sources fiables, réduisant ainsi considérablement le risque d’attaques XSS.

Implémentation de la CSP dans Discourse

À partir de la version 3.3.0.beta1 de Discourse, Discourse implémente une CSP de type ‘strict-dynamic’. Cette approche utilise une seule valeur nonce- et le mot-clé strict-dynamic dans la directive script-src. Toutes les balises <script> initiales dans le cœur et les thèmes se voient automatiquement attribuer l’attribut nonce= approprié.

La politique par défaut inclut les directives suivantes :

  • script-src : Spécifie les sources valides pour les scripts JavaScript
  • worker-src : Spécifie les sources valides pour les scripts ServiceWorker
  • object-src : Bloque l’exécution des plugins (Flash, Java, etc.)
  • base-uri : Restreint les URLs pour les éléments <base>
  • manifest-src : Restreint les URLs pour les manifestes d’applications web
  • frame-ancestors : Contrôle quels sites peuvent intégrer votre instance Discourse dans une iframe
  • upgrade-insecure-requests : Met automatiquement à niveau les requêtes HTTP vers HTTPS (inclus lorsque force_https est activé)

Configuration de la CSP dans Discourse

Paramètres disponibles

  • content_security_policy : Active ou désactive la CSP (par défaut : activé)
  • content_security_policy_report_only : Active le mode Rapport-Only de la CSP (par défaut : désactivé)
  • content_security_policy_script_src : Vous permet d’étendre la directive script-src par défaut
  • content_security_policy_frame_ancestors : Active la directive frame_ancestors (par défaut : activé)

Comment activer la CSP

  1. Accédez à votre panneau d’administration
  2. Allez dans les paramètres de sécurité
  3. Trouvez le paramètre content_security_policy et assurez-vous qu’il est activé

Il est recommandé de commencer par le mode Rapport-Only de la CSP pour identifier d’éventuels problèmes avant d’activer complètement la CSP :

  1. Activez le paramètre content_security_policy_report_only
  2. Surveillez la console de votre navigateur pour les violations de la CSP
  3. Résolvez les violations légitimes en étendant la CSP si nécessaire
  4. Une fois que vous êtes certain qu’il n’y a pas de faux positifs, désactivez le mode Rapport-Only et activez complètement la CSP

Étendre la CSP par défaut

Si vous devez autoriser des sources de scripts supplémentaires, vous pouvez étendre la directive script-src en utilisant le paramètre content_security_policy_script_src. Vous pouvez ajouter :

  • Des sources basées sur des hachages
  • 'wasm-unsafe-eval'
  • 'unsafe-eval' (à utiliser avec prudence)

Par exemple :

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

:warning: Soyez prudent lors de l’ajout de 'unsafe-eval' ou d’autres directives permissives, car elles peuvent réduire l’efficacité de la CSP.

CSP et intégrations tierces

Lors de l’utilisation de services tiers comme Google Tag Manager, Google Analytics ou des services publicitaires, vous devrez peut-être ajuster vos paramètres de CSP. Dans la plupart des cas avec la version 3.3.0.beta1 de Discourse ou ultérieure, les scripts externes devraient fonctionner sans configuration supplémentaire grâce à l’implémentation de la CSP ‘strict-dynamic’.

Si vous rencontrez des problèmes, vous devrez peut-être :

  1. Identifier les sources de scripts requises en surveillant la console de votre navigateur
  2. Ajouter les sources nécessaires au paramètre content_security_policy_script_src
  3. Pour des intégrations complexes comme les services publicitaires qui chargent des ressources externes, vous devrez peut-être activer le rendu inter-domaines (Exemple de PR de discourse-adplugin qui le fait).

Meilleures pratiques

  1. Commencez par le mode Rapport-Only de la CSP pour identifier d’éventuels problèmes
  2. Renforcez progressivement votre CSP au fur et à mesure que vous résolvez les violations légitimes
  3. Passez régulièrement en revue vos paramètres de CSP et ajustez-les si nécessaire
  4. Soyez prudent lors de l’ajout de directives permissives comme 'unsafe-eval' ou 'wasm-unsafe-eval'
  5. Maintenez votre instance Discourse à jour pour bénéficier des dernières améliorations de la CSP

FAQ

Q : Je vois de nombreux rapports de violation de la CSP. Dois-je m’inquiéter ?
R : De nombreuses violations de la CSP sont des faux positifs, souvent causés par des extensions de navigateur ou d’autres scripts sans rapport. Concentrez-vous sur la résolution des violations liées au fonctionnement de votre site.

Q : Puis-je utiliser la CSP avec Google AdSense ou d’autres réseaux publicitaires ?
R : Oui, mais vous devrez peut-être utiliser des paramètres de CSP plus permissifs. Commencez par le mode Rapport-Only et ajustez vos paramètres en fonction des violations signalées.

Q : Comment dépanner les problèmes de CSP ?
R : Utilisez les outils de développement de votre navigateur pour surveiller la console en quête de messages de violation de la CSP. Ils vous aideront à identifier quelles ressources sont bloquées et pourquoi.

Ressources supplémentaires

56 « J'aime »
Adsense Not Working after Recent Discourse Update
Discourse 2.2.0.beta6 Release Notes
Adding statcounter code
How to install npm packages in custom themes/plugins
How to restart Discourse after server reboot?
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)
Push custom events to Google Tag Manager and Analytics
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)
"Unsafe JavaScript attempt to initiate navigation"
(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
Any approved method for adding Javascript before body close?
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

I added a note about this to our public security.md file :tada:

13 « J'aime »

As of this commit, we’ve turned off CSP violations reports by default because the vast majority of the reported violations are false positives.

To illustrate this, here is a screenshot of logs from a site running Discourse with CSP enabled and reporting enabled (filtered using “CSP Violation”):

All of the reported violations are not related to the site’s code:

  • violations with ‘minisrclink.cool’ or ‘proxdev.cool’ in the URL have nothing to do with Discourse, they’re likely coming from a browser extension
  • the Google Analytics violation reports are also not legitimate. They are triggered by Firefox in privacy mode, or Firefox with a privacy extension enabled (like DuckDuckGo Privacy Essentials).
  • Violations with ‘inline’, ‘data’ or ‘about’ are triggered by extensions as well. It’s not shown in the screenshot above, but these violations have some more details in the env tab of the log. In there, under script-sample, some of these violations had code like BlockAdBlock or window.klTabId_kis or AG_onLoad, which come from the AdBlock, Kaspersky, and AdGuard extensions, respectively. (I found this repo: CSP-useful/csp-wtf/README.md at master · nico3333fr/CSP-useful · GitHub very useful in helping explain some of these reports.) Some of these violations will have safari-extension or user-script in the source-file variable (again, in env), so that points to Safari extensions as the culprit for the violation.

In other words, there’s a lot of noise in CSP violation reports, so it’s not useful to log them at all times. They might be helpful while you are configuring CSP, but the reporting should be off during the normal operation of a site.

A few final notes: if you site is using a tag manager (like Google Tag Manager or Segment) you need to load the site in your browser, and carefully examine the violations in the console. These tools load third-party scripts from third-party domains and/or inline scripts so you need to carefully whitelist each of them using the source URL or the hash of the inline script (Chrome usefully includes the hash of inline scripts in the console error statement).

If your site uses an advertising service (like Google Ad Manager, Adsense, etc.) you probably will have to use a very permissive policy:

In the screenshot above, the policy allows any script from a https: source and any inline script. (In the future, this might be replaced by the strict-dynamic keyword, but as of this writing, strict-dynamic isn’t supported by Safari or Edge.)

24 « J'aime »

8 posts were split to a new topic: Protocol-less CDN URLs are problematic

Please note that Safari doesn’t understand some parts of CSP, and this is normal:

You can safely ignore the CSP errors in Safari, you’ll see those on all sites, it just means Safari doesn’t understand worker-src and report-sample .

I guess we need to wait for Safari to be updated?

12 « J'aime »

I’m having trouble configuring, which recommendation?

my forum: forum.meuxbox.com.br

link: White blank advertisement

2 « J'aime »

It depends on what URLs your ads are requesting. You can look at your browser’s console to see them.

See also the relevant section from the OP:

4 « J'aime »

https://meta.discourse.org/t/white-blank-advertisement/140098/3?u=eduardo_braga

this solves the problem of the error

6 « J'aime »

Could you please add a Feature-Policy?

This is the one that I am using for more than a year now. (host nginx)

add_header Feature-Policy “geolocation ‘none’; midi ‘none’; notifications ‘self’; push ‘none’; sync-xhr ‘none’; microphone ‘none’; camera ‘none’; magnetometer ‘none’; gyroscope ‘none’; speaker ‘none’; vibrate ‘none’; fullscreen ‘none’; payment ‘none’;”;


Would it make sense to add the following to Content-Security-Policy header? This is what I am successfully using (added by host nginx, on top of discourse built-in CSP):

default-src 'none'
style-src 'self' domain 'unsafe-inline'
img-src https://*.domain.org data: blob: 'unsafe-inline'
font-src 'self' domain
connect-src 'self' domain
manifest-src 'self' domain
3 « J'aime »

Given that the spec is still a draft, I don’t expect us to implement it at this time. The Mozilla website you listed even says:

The Feature-Policy header is still in an experimental state, and is subject to change at any time. Be wary of this when implementing Feature Policy on your website.

8 « J'aime »

vibrate 'self' - likes on Android trigger a faint, brief vibration.

10 « J'aime »

Je viens d’installer Discourse 2.6.0.beta1. Dois-je le reconfigurer ? Merci.

1 « J'aime »

Ce n’est pas nécessaire, cette option est activée par défaut. Vous ne devez modifier la configuration que si vous constatez que des ressources externes sont bloquées et que vous souhaitez les exécuter.

4 « J'aime »

Je suis en train d’exécuter la version 2.6.0 bêta 2.

J’utilise les services suivants dans les forums :

  • Google Tag Manager
  • Google Ad Manager
  • Google Ad Sense

Actuellement, j’utilise uniquement le mode de rapport CSP pendant que je tente de résoudre tous les problèmes ouverts.

Voici mes paramètres CSP :

Avec les paramètres actuels, je reçois encore BEAUCOUP d’erreurs CSP. Certaines semblent pouvoir être ignorées. Cependant, celle-ci me laisse perplexe car j’ai bien déclaré le domaine dans les paramètres CSP.

Est-ce que je passe à côté de quelque chose ?

CSP Violation: 'https://www.googletagmanager.com/gtm.js?id=GTM-T9ZW6PR'

Backtrace :

/var/www/discourse/app/controllers/csp_reports_controller.rb:9:in `create'
actionpack-6.0.3.2/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack-6.0.3.2/lib/abstract_controller/base.rb:195:in `process_action'
actionpack-6.0.3.2/lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack-6.0.3.2/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport-6.0.3.2/lib/active_support/callbacks.rb:112:in `block in run_callbacks'
/var/www/discourse/app/controllers/application_controller.rb:340:in `block in with_resolved_locale'
i18n-1.8.5/lib/i18n.rb:313:in `with_locale'
/var/www/discourse/app/controllers/application_controller.rb:340:in `with_resolved_locale'
activesupport-6.0.3.2/lib/active_support/callbacks.rb:121:in `block in run_callbacks'
activesupport-6.0.3.2/lib/active_support/callbacks.rb:139:in `run_callbacks'
actionpack-6.0.3.2/lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack-6.0.3.2/lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack-6.0.3.2/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
activesupport-6.0.3.2/lib/active_support/notifications.rb:180:in `block in instrument'
activesupport-6.0.3.2/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-6.0.3.2/lib/active_support/notifications.rb:180:in `instrument'
actionpack-6.0.3.2/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
actionpack-6.0.3.2/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
activerecord-6.0.3.2/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack-6.0.3.2/lib/abstract_controller/base.rb:136:in `process'
actionview-6.0.3.2/lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler-2.0.4/lib/mini_profiler/profiling_methods.rb:78:in `block in profile_method'
actionpack-6.0.3.2/lib/action_controller/metal.rb:190:in `dispatch'
actionpack-6.0.3.2/lib/action_controller/metal.rb:254:in `dispatch'
actionpack-6.0.3.2/lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack-6.0.3.2/lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack-6.0.3.2/lib/action_dispatch/journey/router.rb:49:in `block in serve'
actionpack-6.0.3.2/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-6.0.3.2/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-6.0.3.2/lib/action_dispatch/routing/route_set.rb:834:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
rack-2.2.3/lib/rack/tempfile_reaper.rb:15:in `call'
rack-2.2.3/lib/rack/conditional_get.rb:40:in `call'
rack-2.2.3/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:336:in `call'
rack-2.2.3/lib/rack/session/abstract/id.rb:266:in `context'
rack-2.2.3/lib/rack/session/abstract/id.rb:260:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/cookies.rb:648:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport-6.0.3.2/lib/active_support/callbacks.rb:101:in `run_callbacks'
actionpack-6.0.3.2/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
logster-2.9.3/lib/logster/middleware/reporter.rb:43:in `call'
railties-6.0.3.2/lib/rails/rack/logger.rb:37:in `call_app'
railties-6.0.3.2/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:19:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:22:in `call'
rack-2.2.3/lib/rack/method_override.rb:24:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/executor.rb:14:in `call'
rack-2.2.3/lib/rack/sendfile.rb:110:in `call'
actionpack-6.0.3.2/lib/action_dispatch/middleware/host_authorization.rb:76:in `call'
rack-mini-profiler-2.0.4/lib/mini_profiler/profiler.rb:200:in `call'
message_bus-3.3.1/lib/message_bus/rack/middleware.rb:61:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:176:in `call'
railties-6.0.3.2/lib/rails/engine.rb:527:in `call'
railties-6.0.3.2/lib/rails/railtie.rb:190:in `public_send'
railties-6.0.3.2/lib/rails/railtie.rb:190:in `method_missing'
rack-2.2.3/lib/rack/urlmap.rb:74:in `block in call'
rack-2.2.3/lib/rack/urlmap.rb:58:in `each'
rack-2.2.3/lib/rack/urlmap.rb:58:in `call'
unicorn-5.6.0/lib/unicorn/http_server.rb:632:in `process_client'
unicorn-5.6.0/lib/unicorn/http_server.rb:728:in `worker_loop'
unicorn-5.6.0/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
unicorn-5.6.0/lib/unicorn/http_server.rb:144:in `start'
unicorn-5.6.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

Env 1 :

hostname	forums-web-only
process_id	27127
application_version	f2e14a3946b020ace5a368614f0da198cd17aa32
HTTP_HOST	forums.paddling.com
REQUEST_URI	/csp_reports
REQUEST_METHOD	POST
HTTP_USER_AGENT	Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0
HTTP_ACCEPT	*/*
HTTP_X_FORWARDED_FOR	74.76.45.218
HTTP_X_REAL_IP	74.76.45.218
time	13h44

Env 2 :

hostname	forums-web-only
process_id	27161
application_version	f2e14a3946b020ace5a368614f0da198cd17aa32
HTTP_HOST	forums.paddling.com
REQUEST_URI	/csp_reports
REQUEST_METHOD	POST
HTTP_USER_AGENT	Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
HTTP_ACCEPT	*/*
HTTP_X_FORWARDED_FOR	66.58.144.146
HTTP_X_REAL_IP	66.58.144.146
time	13h39

Env 3 :

hostname	forums-web-only
process_id	27111
application_version	f2e14a3946b020ace5a368614f0da198cd17aa32
HTTP_HOST	forums.paddling.com
REQUEST_URI	/csp_reports
REQUEST_METHOD	POST
HTTP_USER_AGENT	Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
HTTP_ACCEPT	*/*
HTTP_REFERER	https://forums.paddling.com/t/need-advice-loading-a-kayak-onto-j-rac/60058
HTTP_X_FORWARDED_FOR	174.83.24.11
HTTP_X_REAL_IP	174.83.24.11
time	12h16
2 « J'aime »

Il y a énormément de faux positifs dans les rapports CSP. Consultez ma réponse précédente pour plus de détails.

Vous n’avez pas besoin de la plupart des règles que vous avez définies dans votre capture d’écran ; seules https: et unsafe-inline suffisent, car elles autorisent tous les scripts commençant par https et tous les scripts en ligne. Essayez de nettoyer vos paramètres de sources CSP et d’activer CSP (sans rapport), cela devrait fonctionner.

8 « J'aime »

Bonjour, je me demandais simplement : la directive Content-Security-Policy: frame-ancestors ‘none’ fait-elle partie de celles qui « seront incluses dans les prochaines mises à jour », comme mentionné par l’OP ?

Est-il possible d’ajouter cette directive d’une manière ou d’une autre, ou dois-je simplement attendre et ne pas m’en soucier ? Je venais de réaliser un exercice de durcissement et c’était le seul point ouvert / recommandation de cet outil de sécurité en ligne. Cela me donne beaucoup confiance dans la plateforme, bravo les gars !

5 « J'aime »

Je ne suis pas sûr – qu’en penses-tu @xrav3nz ?

4 « J'aime »

Je dirais de ne pas vous en soucier pour l’instant.

frame-ancestors est similaire à l’en-tête X-Frame-Options que Discourse/Rails applique déjà. L’en-tête est actuellement défini sur sameorigin – à peu près équivalent à l’option self de la directive CSP.

À mon avis, nous ne gagnerons pas grand-chose à implémenter frame-ancestors pour le moment, sauf si nous devons prendre en charge la liste blanche de domaines spécifiques autres que self.

8 « J'aime »

Je suis d’accord avec cela.

Chasser chaque “problème” potentiel détecté par les scanners de vulnérabilités peut finir par casser des éléments importants, pour un rapport risque-bénéfice très faible.

Il existe de nombreuses “vulnérabilités théoriques” qui sont rarement exploitées ou ne peuvent l’être que dans des scénarios très spécifiques. À ma connaissance, ce type de vulnérabilité potentielle n’a jamais été exploité sur un site Discourse ; et je déconseille de “réparer” des éléments qui sont “théoriquement” une vulnérabilité mais qui n’ont entraîné aucune brèche significative.

Voilà mon avis, en tant que professionnel de la cybersécurité depuis plusieurs décennies. Je serais ravi de discuter des bases de la gestion des risques en cybersécurité si quelqu’un est intéressé.

5 « J'aime »

Nous venons d’ajouter la prise en charge de la directive CSP frame-ancestors. Pour l’instant, elle est désactivée par défaut et régie par le paramètre du site « content security policy frame ancestors ». Vous pouvez ajouter des domaines à la liste via /admin/customize/embedding, comme d’habitude.

Cette directive sera activée par défaut lors du prochain cycle de publication.

7 « J'aime »