À quoi sert l'attribut HTML «nonce» pour les éléments de script et de style?

141

W3C dit qu'il ya un nouvel attribut dans HTML5.1 appelé noncepour styleet scriptqui peut être utilisé par le contenu politique de sécurité d'un site Web.

J'ai cherché sur Google mais je n'ai finalement pas compris ce que fait réellement cet attribut et quels changements lors de son utilisation?

à
la source
2
On dirait que c'est juste un peu plus de sécurité pour votre site, vous l'ajoutez à un lien ou à un formulaire et lorsque la page est servie, si le nonce ne correspond pas au vôtre, alors vous ne servez pas la page
Pete
@Pete Vous voulez dire que personne ne pourrait charger votre scriptet style? Quelque chose comme l'interdiction de hotlink?
ata
c'est aussi pour les pages normales et la validation de formulaire
Pete

Réponses:

196

L' nonceattribut vous permet de «mettre sur liste blanche» certains éléments scriptet styleéléments en ligne, tout en évitant l'utilisation de la unsafe-inlinedirective CSP (qui autoriserait tous les éléments script/ en ligne style), de sorte que vous conserviez toujours la fonctionnalité clé du CSP consistant à interdire les éléments en ligne script/ styleen général.

Ainsi, l' nonceattribut est un moyen d'indiquer aux navigateurs que le contenu en ligne d'un script ou d'un élément de style particulier n'a pas été injecté dans le document par un tiers (malveillant), mais a été placé dans le document intentionnellement par celui qui contrôle le serveur sur lequel le document est servi. de.

https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it donne un bon exemple d'utilisation de l' nonceattribut, qui se résume aux étapes suivantes:

  1. Pour chaque demande que votre serveur Web reçoit pour un document particulier, demandez à votre backend de générer une chaîne aléatoire codée en base64 d'au moins 128 bits de données à partir d'un générateur de nombres aléatoires sécurisé par cryptographie; par exemple EDNnf03nceIOfn39fn3e9h3sdfa. C'est votre nonce.

  2. Prenez le nonce généré à l'étape 1, et pour tout élément en ligne script/ que stylevous souhaitez «ajouter à la liste blanche», faites en sorte que votre code backend insère un nonceattribut dans le document avant qu'il ne soit envoyé sur le fil, avec ce nonce comme valeur:

    <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa"></script>
  3. Prenez le nonce généré à l'étape 1, ajoutez- nonce-y le préfixe et faites en sorte que votre backend génère un en-tête CSP avec celui parmi les valeurs de la liste source pour script-srcou style-src:

    Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

Ainsi, le mécanisme d'utilisation d'un nonce est une alternative à la place que votre backend génère un hachage du contenu de l'inline scriptou que stylevous souhaitez autoriser, puis en spécifiant ce hachage dans la liste source appropriée de votre en-tête CSP.

Notez que comme les navigateurs ne vérifient pas (ne peuvent pas) vérifier que la valeur nonce envoyée change entre les requêtes de page, il est possible - bien que totalement déconseillé - d'ignorer 1 ci-dessus et de ne pas laisser votre backend faire quoi que ce soit dynamiquement pour le nonce, auquel cas vous pourrait simplement mettre un nonceattribut avec une valeur statique dans la source HTML de votre document, et envoyer un en-tête CSP statique avec cette même valeur nonce.

Mais la raison pour laquelle vous ne voudriez pas utiliser un nonce statique de cette manière est que cela irait pratiquement à l'encontre de l'objectif de l'utilisation du nonce du tout pour commencer - parce que, si vous deviez utiliser un nonce statique comme celui-là, à ce stade, vous pourriez aussi bien utiliser unsafe-inline.

soiree
la source
17
Ce n'est pas pour vérifier l'utilisateur - c'est pour vérifier que le contenu en ligne d'un script ou d'un élément de style particulier n'a pas été injecté dans le document par un tiers (malveillant), mais a été mis dans le document intentionnellement par celui qui contrôle le serveur le document est servi à partir de. (Je vais mettre à jour ma réponse pour dire cela.)
Sideshowbarker
3
Les nonces n'ont pas besoin d'être stockés - au lieu de cela, ils sont générés en mémoire et insérés dans l'en-tête CSP et le document HTML qui est envoyé sur le câble dans les réponses (pas à la source stockée sur le système de fichiers / base de données du serveur).
Sideshowbarker
3
En ce qui concerne toute raison de faire des efforts pour utiliser l' nonceattribut, si vous n'avez pas absolument besoin de l'utiliser, alors ne le faites pas. C'est vraiment uniquement destiné aux cas où, pour une raison quelconque, vous ne pouvez pas (encore) vous débarrasser de certains scripts en ligne ou du contenu de style d'un document particulier (mais vous devriez le supprimer plus tard). Donc, si pour une raison quelconque vous êtes coincé avec le besoin de conserver le contenu du script et du style en ligne, vous pouvez au moins utiliser le mécanisme nonce pour permettre aux navigateurs de vérifier qu'ils sont OK. Sinon, vous devriez simplement utiliser pleinement CSP comme prévu, et ne permettre aucun script ou élément de style en ligne
Sideshowbarker
2
@sideshowbarker, Que fait un nonce vide? Je vois des pages avec <script type="text/javascript" nonce>et<style type="text/css" nonce>
Pacerier
7
Remarque: si votre script est statique, je recommande un hachage CSP, plutôt qu'un nonce.
Brian