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

Nonces

Comment fonctionnent les nonces de CSP script-src, comment les générer en toute sécurité et les erreurs qui les désactivent silencieusement.

Un nonce autorise un unique script en ligne en le marquant d'une valeur aléatoire qui apparaît aussi dans l'en-tête. Utilisez les nonces lorsque votre serveur génère les pages dynamiquement et peut émettre une nouvelle valeur à chaque réponse.

Fonctionnement

Placez la même valeur aléatoire dans la directive script-src et sur la balise de script :

Content-Security-Policy: script-src 'nonce-2726c7f26c'
<script nonce="2726c7f26c">
  console.log('this inline script runs');
</script>

Le navigateur exécute le script en ligne uniquement lorsque l'attribut nonce de la balise correspond à la valeur de l'en-tête. Un attaquant qui injecte une balise <script> ne peut pas deviner le nonce courant, si bien que le script injecté est bloqué.

Règles qui rendent un nonce sûr

Un nonce n'offre une protection que si toutes ces conditions sont réunies :

  1. Nouveau à chaque réponse. Générez une nouvelle valeur par réponse HTTP. Un nonce réutilisé d'une réponse à l'autre, ou codé en dur dans votre gabarit, donne à un attaquant une valeur qu'il peut copier.
  2. Imprévisible. Utilisez une source aléatoire cryptographiquement sûre avec au moins 128 bits d'entropie, puis encodez-la en base64. Ne la dérivez pas de l'heure, d'un compteur ou de l'identifiant de session.
  3. Générée par le serveur. La valeur doit provenir du serveur qui définit l'en-tête. Vous ne pouvez pas ajouter un nonce depuis du JavaScript côté client, car l'en-tête est déjà analysé à ce moment-là.

Générez-la à partir d'une source aléatoire cryptographiquement sûre sur le serveur, par exemple 16 octets via crypto.randomBytes encodés en base64, à chaque réponse.

unsafe-inline est ignoré lorsqu'un nonce est présent

Les navigateurs qui prennent en charge les nonces ignorent 'unsafe-inline' dès qu'un nonce ou un hachage est présent dans la même directive. Cela vous permet de conserver 'unsafe-inline' comme repli pour les très anciens navigateurs sans affaiblir les navigateurs modernes :

script-src 'nonce-2726c7f26c' 'unsafe-inline'

Les navigateurs modernes respectent le nonce et ignorent 'unsafe-inline'. Les navigateurs anciens qui ne comprennent pas les nonces se replient sur 'unsafe-inline'.

Nonces et scripts chargés dynamiquement

Un nonce s'applique à la balise exacte sur laquelle il est placé. Si ce script injecte ensuite d'autres éléments <script>, ces enfants n'héritent pas du nonce et seront bloqués. Pour permettre à un script de confiance de charger ses propres dépendances, combinez le nonce avec strict-dynamic.

Erreurs courantes

  • Générer le nonce dans un fragment HTML mis en cache, si bien que chaque visiteur reçoit la même valeur.
  • Oublier l'attribut nonce sur la balise alors qu'il est dans l'en-tête, ou l'inverse.
  • Ajouter un nonce à un script externe via src. Cela fonctionne, mais le nonce n'est nécessaire que lorsque l'hôte n'est pas déjà autorisé.