script-src nonces ou hachages : lequel utiliser
Par Thomas Poyeton
Dès que vous ajoutez une directive script-src à votre Content-Security-Policy,
les blocs <script> en ligne cessent de s'exécuter tant que vous ne les autorisez
pas explicitement. Vous disposez de deux moyens pour le faire : un nonce ou un
hachage. Ils résolvent le même problème par des approches opposées.
Nonces : un jeton aléatoire par réponse
Un nonce est une valeur aléatoire à usage unique que votre serveur génère pour chaque réponse HTTP et place à la fois dans l'en-tête et sur la balise script :
Content-Security-Policy: script-src 'nonce-r4nd0m'
<script nonce="r4nd0m">/* allowed */</script>
Le navigateur exécute le script en ligne uniquement si le nonce de la balise
correspond à celui de l'en-tête. Comme la valeur est impossible à deviner et
change à chaque réponse, un attaquant qui injecte un <script> ne peut pas
connaître le nonce courant, et son script est donc bloqué.
Le point clé : vous devez générer un nouveau nonce à chaque réponse. Réutiliser un nonce entre plusieurs réponses, ou le coder en dur, réduit à néant tout le mécanisme.
Hachages : figer les octets exacts
Un hachage autorise un script en ligne par le hachage SHA de son contenu :
Content-Security-Policy: script-src 'sha256-BpfBOAGstzX3x9…'
Aucune logique serveur par requête n'est nécessaire, ce qui rend les hachages idéaux pour les sites statiques et les scripts en ligne qui ne changent jamais. Le compromis est leur fragilité : le hachage couvre les octets exacts situés entre les balises, si bien qu'un seul espace ajouté l'invalide.
Lequel choisir ?
- Pages dynamiques rendues côté serveur → nonce. Vous effectuez déjà un rendu par requête, donc émettre une nouvelle valeur ne coûte presque rien.
- Sites statiques / scripts en ligne inchangés → hachage. Aucune logique serveur requise.
- Nombreux scripts tiers que vous ne contrôlez pas → envisagez
'strict-dynamic'en complément d'un nonce, afin que les scripts de confiance puissent charger leurs propres dépendances.
Vous pouvez calculer un hachage avec le générateur de hachage de script en ligne gratuit de ce site.
Vérifier l'ensemble de la politique
Les nonces et les hachages ne couvrent que les scripts en ligne. Le reste de
votre script-src (et de chaque autre directive) doit tout de même être correct.
Pour évaluer une Content-Security-Policy complète et détecter les contournements
connus, analysez-la avec
l'évaluateur CSP de CentralCSP.