Résoudre les problèmes de scripts bloqués
Les erreurs de console produites par une violation de script-src et comment corriger chacune, des scripts en ligne bloqués aux problèmes d'eval et de strict-dynamic.
Lorsque script-src bloque un script, le navigateur écrit un message de console
qui en nomme la raison. Cette page fait correspondre les messages courants à leur
correctif.
"Refused to execute inline script"
Message complet : Refused to execute inline script because it violates the following Content Security Policy directive.
La page contient un <script> en ligne et votre politique n'autorise pas
l'exécution en ligne. Choisissez l'une des options :
- Ajoutez un nonce à la balise et à l'en-tête.
- Ajoutez le hachage du script à l'en-tête.
- Déplacez le code dans un fichier externe servi depuis un hôte autorisé.
Ajouter 'unsafe-inline' fait aussi taire l'erreur, mais consultez les
mots-clés unsafe pour comprendre pourquoi cela
supprime votre protection.
"Refused to execute inline event handler"
C'est la même catégorie d'erreur pour un attribut comme onclick="…". Les
gestionnaires d'événements en ligne sont couverts par script-src-attr, qui se
replie sur script-src. Le correctif propre consiste à déplacer le gestionnaire
dans un script :
<!-- blocked -->
<button onclick="save()">Save</button>
<!-- allowed: attach the listener from a nonced or hashed script -->
<button id="save">Save</button>
<script nonce="r4nd0m">
document.getElementById('save').addEventListener('click', save);
</script>
"Refused to load the script 'https://…'"
L'hôte d'un script externe n'est pas dans la liste de sources. Ajoutez l'hôte,
ou si vous utilisez 'strict-dynamic', chargez-le
depuis un script déjà de confiance grâce à un nonce ou un hachage plutôt que par
hôte.
"Refused to evaluate a string as JavaScript"
Votre code appelle eval, new Function ou setTimeout avec une chaîne, et
'unsafe-eval' n'est pas présent. Préférez supprimer l'appel qui transforme une
chaîne en code. S'il provient d'une dépendance que vous ne pouvez pas encore
modifier, ajoutez 'unsafe-eval' comme autorisation temporaire et suivie. Pour
WebAssembly uniquement, utilisez plutôt 'wasm-unsafe-eval'.
Un nonce est présent mais le script reste bloqué
Vérifiez chacun de ces points :
- La valeur de l'attribut
noncecorrespond exactement à la valeur de l'en-tête. - Le nonce de l'en-tête est différent à chaque réponse. Une page mise en cache peut servir un nonce périmé qui ne correspond plus.
- Vous lisez l'en-tête appliqué, et non un en-tête
Content-Security-Policy-Report-Only, qui rapporte mais ne bloque pas.
strict-dynamic n'a pas autorisé un script enfant
'strict-dynamic' ne propage la confiance qu'aux scripts créés via l'API DOM,
comme document.createElement('script'). Les scripts injectés avec
document.write ou innerHTML restent bloqués par conception. Si un chargeur
s'appuie sur document.write, il ne fonctionnera pas sous 'strict-dynamic'.
Voir ce qui est réellement bloqué en production
Les erreurs de console ne montrent que ce que vous rencontrez par hasard pendant vos tests. Pour capturer chaque violation sur le trafic réel, activez la remontée des rapports de violation.