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 :
- 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.
- 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.
- 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
noncesur 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é.