212 votes

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

Le W3C indique qu'il existe un nouvel attribut dans HTML5.1 appelé nonce para style y script qui peut être utilisé par la politique de sécurité du contenu d'un site web.

J'ai fait des recherches sur Internet mais je n'ai pas réussi à comprendre ce que fait cet attribut et ce qui change quand on l'utilise.

5 votes

Il semble qu'il s'agisse d'un élément de sécurité supplémentaire 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, la page n'est pas servie.

0 votes

@Pete Vous voulez dire qu'alors personne ne pourrait charger votre script y style ? Quelque chose comme l'interdiction des liens chauds ?

0 votes

C'est aussi pour les pages normales et la validation des formulaires

285voto

sideshowbarker Points 29042

Le site nonce vous permet d'établir une liste blanche de certains éléments en ligne. script y style tout en évitant l'utilisation des éléments CSP unsafe-inline (qui permettrait à todo en ligne script / style ), de sorte que vous conservez la caractéristique clé de CSP, qui consiste à interdire l'utilisation d'instructions en ligne. script / style en général.

Ainsi, le nonce 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 qu'il a été placé intentionnellement dans le document par la personne qui contrôle le serveur à partir duquel le document est servi.


Les fondamentaux du Web Politique de sécurité du contenu de l'article _Si vous devez absolument l'utiliser..._ contient un bon exemple de l'utilisation de l'option nonce ce qui revient à suivre les étapes suivantes :

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

  2. Prenez le nonce généré à l'étape 1, et pour tout inline script / style que vous voulez mettre sur une "liste blanche", faites en sorte que votre code backend insère un nonce dans le document avant qu'il ne soit envoyé sur le réseau, avec ce nonce comme valeur :

     <script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
  3. Prenez le nonce généré à l'étape 1, précédez-le de l'expression "nonce". nonce- et faites en sorte que votre backend génère un en-tête CSP avec cette valeur parmi les valeurs de la liste des sources pour l'option script-src o style-src :

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

Le mécanisme d'utilisation d'un nonce est donc une alternative à la génération par votre backend d'un hash du contenu du fichier inline script o style que vous souhaitez autoriser, puis en spécifiant ce hachage dans la liste de sources appropriée de votre en-tête CSP.


Remarque : les navigateurs ne vérifient pas (ne peuvent pas vérifier) que les valeurs de nonce envoyées par les serveurs changent réellement entre les requêtes de page ; il est donc possible - bien que totalement déconseillé - d'ignorer le point 1 ci-dessus et de faire en sorte que votre backend ne fasse rien dynamiquement pour le nonce, auquel cas vous pouvez simplement mettre un fichier nonce avec une valeur statique dans la source HTML de votre document, et envoyez 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 façon est que cela irait à l'encontre de l'objectif d'utiliser le nonce pour commencer - parce que, si vous deviez utiliser un nonce statique comme ça, à ce moment-là, vous pourriez tout aussi bien utiliser simplement unsafe-inline .


En ce qui concerne les éléments qui sont "non-cachables" : La spécification CSP limite actuellement les navigateurs à vérifier les nonces uniquement pour les éléments suivants script y style éléments. Voici les détails de la fiche technique :

0 votes

Puis nonce utiliser pour vérifier l'utilisateur ? Quelle vérification est requise pour style ?

29 votes

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 qu'il a été placé dans le document intentionnellement par celui qui contrôle le serveur à partir duquel le document est servi. (Je vais mettre à jour ma réponse pour le préciser).

0 votes

Une autre chose, disons qu'un site a un trafic considérable, donc des milliers de nonce sont créés et stockés. Cela réduit définitivement les performances du serveur. Si ce site ne reçoit pas de données importantes de la part de l'utilisateur, comme des mots de passe ou des comptes bancaires, y a-t-il une raison de faire cet effort et d'utiliser cet attribut ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X