CentralCSP
PolitiquesContent-Security-PolicyDirectives

script-src-attr

La directive CSP script-src-attr contrôle les event handlers inline comme onclick. Chaîne de repli, valeurs et risques.

Dernière mise à jour:

La directive script-src-attr d'une politique de sécurité du contenu (Content Security Policy, CSP) contrôle les attributs event handler inline, le JavaScript écrit directement dans des attributs HTML tels que onclick, onload et onmouseover. Elle ne couvre pas les éléments <script>, ceux-ci relèvent de script-src-elem. Utilisez script-src-attr pour appliquer une règle distincte, en général plus stricte, aux handlers inline.

Une politique minimale sûre pour cette directive, qui bloque tous les handlers inline:

Content-Security-Policy: script-src-attr 'none'

Chaîne de repli

script-src-attr se replie sur script-src, puis sur default-src. Si vous ne définissez pas script-src-attr, les handlers inline sont vérifiés contre script-src, et si elle est absente, contre default-src. Définir script-src-attr remplace script-src pour les attributs de handler uniquement.

La plupart des politiques n'ont pas besoin de script-src-attr, car script-src couvre déjà les handlers. La raison habituelle de la définir est d'interdire complètement les handlers inline avec 'none' tout en autorisant encore des éléments script via script-src.

Valeurs

script-src-attr accepte les mêmes types de valeurs que script-src, mais seules quelques-unes peuvent correspondre à un handler inline.

ValeurStatutDescription
'none'✅ BonBloque tous les event handlers inline. S'utilise seule.
'sha256-...'✅ BonEmpreinte du texte exact du handler; ne correspond qu'avec 'unsafe-hashes'.
'unsafe-hashes'❌ RisquéPermet aux hashes de correspondre aux attributs de handler; rouvre cette surface, à réserver à une migration.
'report-sample'✅ BonAjoute les 40 premiers caractères du handler bloqué aux reports.
'unsafe-inline'❌ RisquéAutorise tous les handlers inline, y compris injectés.

La grammaire accepte aussi 'self' et des sources host, scheme et nonce, mais un handler inline n'a pas d'URL à laquelle les faire correspondre. En pratique, script-src-attr s'utilise avec un petit ensemble de valeurs:

  • 'none' pour bloquer tous les event handlers inline.
  • 'unsafe-inline' pour tous les autoriser (déconseillé).
  • Un hash accompagné du mot-clé 'unsafe-hashes', qui est ce qui permet à un hash de correspondre à un handler inline.

Un nonce ne peut pas marquer un attribut, donc les handlers sont autorisés par 'unsafe-inline' ou par un hash plus 'unsafe-hashes', pas par un nonce.

Exemples

Bloquer tous les event handlers inline tout en laissant les éléments script se charger normalement:

Content-Security-Policy:
    script-src 'self' 'nonce-r4nd0m';
    script-src-attr 'none'

Usage courant

La configuration la plus propre est script-src-attr 'none', qui force tout le comportement dans des fichiers de script marqués d'un nonce et correspond au schéma de la CSP stricte, voir le guide strict-dynamic et comment script-src-elem et script-src-attr se répartissent script-src. Si vous ne pouvez pas retirer un handler hérité immédiatement, hachez-le et ajoutez 'unsafe-hashes', puis prévoyez de migrer le handler dans un fichier de script. Le générateur de hash calcule l'empreinte, et l'évaluateur CSP signale les règles de handler faibles.

Notes de sécurité

Les event handlers inline sont un point d'entrée XSS fréquent, un onclick injecté exécute du code dans le contexte de la page. script-src-attr 'none' supprime entièrement ce point d'entrée.

  • 'unsafe-inline' autorise tous les handlers, y compris injectés, donc il annule la protection. Voir pourquoi abandonner unsafe-inline.
  • 'unsafe-hashes' ne fait qu'élargir la correspondance des hashes aux handlers et aux attributs style=. Il n'autorise pas à lui seul les URL javascript: ni des blocs <script> inline entiers.

Contournements et risques connus

Le risque principal est de laisser les handlers ouverts par accident. Si script-src-attr n'est pas définie et que script-src (ou default-src) porte 'unsafe-inline', tous les handlers inline s'exécutent, même avec une règle serrée sur les éléments script. Définissez script-src-attr 'none' pour fermer cette brèche.

'unsafe-hashes' est un assouplissement contrôlé, mais chaque handler haché est une chaîne figée. Le moindre changement du texte du handler casse le hash, et la tentation est de retomber sur 'unsafe-inline', qui rouvre le point d'entrée. Traitez les handlers hachés comme une étape de migration, pas comme une destination.

Recommandation

Déployez la politique stricte à base de nonce et rendez l'interdiction des handlers explicite:

Content-Security-Policy:
    script-src 'nonce-{RANDOM}' 'strict-dynamic';
    script-src-attr 'none';
    object-src 'none';
    base-uri 'none'

La CSP stricte que recommandent la cheat sheet CSP d'OWASP et web.dev bloque déjà les handlers inline, puisque rien n'y les autorise. Ajouter script-src-attr 'none' exprime cette intention directement et garde les handlers bloqués même si script-src est assouplie plus tard. Déplacez le code des handlers dans des fichiers de script marqués d'un nonce.

Reporting

Un handler inline bloqué produit un report csp-violation avec script-src-attr comme directive effective. Ajoutez 'report-sample' pour inclure un court extrait du handler afin de le localiser. CentralCSP agrège ces reports pour que vous puissiez trouver et retirer les handlers inline avant de resserrer la directive.

Prise en charge par les navigateurs

Largement prise en charge par les navigateurs actuels.

Voir aussi

Sources

On this page