Aller au contenu
script-src.com
script-src.com
EN / FR

strict-dynamic

Comment le mot-clé strict-dynamic propage la confiance d'un nonce ou d'un hachage vers les scripts chargés dynamiquement, et le modèle de CSP stricte recommandé.

'strict-dynamic' permet à un script auquel vous faites déjà confiance, via un nonce ou un hachage, de charger d'autres scripts sans que chacun ait besoin de sa propre entrée dans la liste d'autorisation. C'est la manière pratique d'exécuter une CSP stricte sur un site comportant de nombreux scripts tiers.

Le problème qu'il résout

Les listes d'hôtes autorisés sont difficiles à maintenir à la fois sûres et complètes. Un seul CDN de confiance qui héberge aussi un point de terminaison exploitable, ou un gestionnaire de balises qui charge des dizaines de fournisseurs changeants, rend une liste d'hôtes exacte quasi impossible. Les listes d'hôtes de script-src sont aussi une source fréquente de contournements.

'strict-dynamic' remplace la liste d'hôtes par une chaîne de confiance. Vous faites confiance à un script de premier niveau via un nonce ou un hachage, et tout script qu'il crée avec le DOM devient également de confiance.

Comment la confiance se propage

Lorsque 'strict-dynamic' est présent, un script autorisé par un nonce ou un hachage peut créer d'autres scripts, par exemple avec document.createElement('script'), et ceux-ci héritent de la confiance :

Content-Security-Policy: script-src 'nonce-r4nd0m' 'strict-dynamic'
<script nonce="r4nd0m" src="https://loader.example.com/tag.js"></script>

Ici, tag.js est de confiance grâce à son nonce. Tout script que tag.js injecte via le DOM est également autorisé, sans qu'aucune entrée d'hôte ne soit requise.

La confiance ne se propage pas à l'injection de script basée sur le balisage, comme document.write ou l'affectation de innerHTML. Celles-ci restent bloquées, ce qui est le but : les chargeurs légitimes utilisent l'API DOM, la plupart des XSS utilisent le balisage.

Les sources d'hôte et self sont ignorées

Lorsqu'un navigateur honore 'strict-dynamic', il ignore les sources d'hôte, les sources de schéma et 'self' dans la même directive. La confiance provient uniquement du nonce ou du hachage et de la chaîne qu'il amorce. C'est délibéré, et cela signifie que vous ne pouvez pas mélanger une politique strict-dynamic avec une liste d'hôtes autorisés pour la même directive.

Le modèle strict recommandé

Une base largement utilisée qui reste sûre sur les navigateurs modernes et se dégrade sur les anciens :

Content-Security-Policy:
  script-src 'nonce-r4nd0m' 'strict-dynamic' 'unsafe-inline' https:;
  object-src 'none';
  base-uri 'none'

Comment chaque partie est interprétée :

  • Les navigateurs modernes utilisent le nonce et 'strict-dynamic', et ignorent 'unsafe-inline' et https:.
  • Les navigateurs qui prennent en charge les nonces mais pas 'strict-dynamic' se rabattent sur le nonce plus https:.
  • Les très anciens navigateurs sans prise en charge des nonces se rabattent sur 'unsafe-inline'.

object-src 'none' et base-uri 'none' referment deux contournements qu'une politique limitée à script-src laisse ouverts.

Quand ne pas l'utiliser

Si votre site possède un ensemble restreint et stable d'hôtes de scripts et aucun chargeur dynamique, une simple liste d'hôtes autorisés ou 'self' plus des nonces est plus simple à raisonner. Optez pour 'strict-dynamic' lorsque la liste d'hôtes est devenue ingérable.