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'ethttps:. - Les navigateurs qui prennent en charge les nonces mais pas
'strict-dynamic'se rabattent sur le nonce plushttps:. - 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.