Cette page a été traduite à partir de l'anglais par la communauté.Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
En-tête Content-Security-Policy (CSP)
Baseline Widely available *
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis août 2016.
* Certaines parties de cette fonctionnalité peuvent bénéficier de prise en charge variables.
L'en-tête de réponse HTTPContent-Security-Policy permet aux administrateur·ice·s d'un site web de contrôler les ressources que l'agent utilisateur est autorisé à charger pour une page donnée. À quelques exceptions près, les règles consistent principalement à définir les origines du serveur et les points d'accès pour les scripts.Cela permet de se prémunir contre les attaquesde script inter-sites.
Pour plus d'informations, consultez leguide Content Security Policy (CSP) pour des détails sur la livraison d'une CSP au navigateur, son apparence, ainsi que des cas d'utilisation et des stratégies de déploiement.
| Type d'en-tête | En-tête de réponse |
|---|
Dans cet article
Syntaxe
Content-Security-Policy: <policy-directive>; <policy-directive>où<policy-directive> se compose de :<directive> <value> sans ponctuation interne.
Directives
>Directives de récupération (fetch)
Les directives de récupération contrôlent les emplacements à partir desquels certains types de ressources peuvent être chargés.
child-srcDéfinit les sources valides pour lesweb workers et les contextes de navigation imbriqués chargés avec des éléments HTML tels que
<frame>et<iframe>.Repli pour
frame-srcetworker-src.connect-srcRestreint les URL qui peuvent être chargées via les interfaces de script.
default-srcSert de repli pour les autresdirectives de récupération.
Repli pour toutes les autres directives de récupération.
fenced-frame-srcExpérimentalDéfinit les sources valides pour les contextes de navigation imbriqués chargés dans des éléments HTML
<fencedframe>.font-srcDéfinit les sources valides pour les polices chargées avec
@font-face.frame-srcDéfinit les sources valides pour les contextes de navigation imbriqués chargés dans des éléments HTML tels que
<frame>et<iframe>.img-srcDéfinit les sources valides pour les images et les favicons.
manifest-srcDéfinit les sources valides pour les fichiers de manifeste d'application.
media-srcDéfinit les sources valides pour le chargement des médias avec les éléments HTML
<audio>,<video>et<track>.object-srcDéfinit les sources valides pour les éléments HTML
<object>et<embed>.prefetch-srcObsolèteNon standardDéfinit les sources valides à précharger ou à pré-rendre.
script-srcDéfinit les sources valides pour les ressources JavaScript et WebAssembly.
Repli pour
script-src-elemetscript-src-attr.script-src-elemDéfinit les sources valides pour les éléments HTML JavaScript
<script>.script-src-attrDéfinit les sources valides pour les gestionnaires d'évènements JavaScript en ligne.
style-srcDéfinit les sources valides pour les feuilles de styles.
Repli pour
style-src-elemetstyle-src-attr.style-src-elemDéfinit les sources valides pour les éléments HTML
<style>et les éléments HTML<link>ayantrel="stylesheet".style-src-attrDéfinit les sources valides pour les styles en ligne appliqués à des éléments individuels du DOM.
worker-srcDéfinit les sources valides pour les scripts
Worker,SharedWorkerouServiceWorker.
Toutes les directives de récupération peuvent être définies avec la valeur unique'none', indiquant que le type de ressource concerné doit être complètement bloqué, ou avec une ou plusieurs valeurs d'expression de source, indiquant les sources valides pour ce type de ressource. VoirSyntaxe des directives de récupération pour plus de détails.
Replis
Certaines directives de récupération servent de replis pour d'autres directives plus spécifiques. Cela signifie que si la directive plus spécifique n'est pas définie, alors le repli est utilisé pour définir une règle pour ce type de ressource.
default-srcest un repli pour toutes les autres directives de récupération.script-srcest un repli pourscript-src-attretscript-src-elem.style-srcest un repli pourstyle-src-attretstyle-src-elem.child-srcest un repli pourframe-srcetworker-src.
Par exemple :
- Si
img-srcest omise mais quedefault-srcest incluse, alors la règle définie pardefault-srcsera appliquée aux images. - Si
script-src-elemest omise mais quescript-srcest incluse, alors la règle définie parscript-srcsera appliquée aux éléments<script>. - Si
script-src-elemetscript-srcsont toutes deux omises, mais quedefault-srcest incluse, alors la règle définie pardefault-srcsera appliquée aux éléments<script>.
Directives de document
Les directives de document permettent de paramétrer les propriétés d'un document ou d'un environnementworker auquel une règle s'applique.
Directives de navigation
Les directives de navigation permettent de paramétrer les emplacements vers lesquels l'utilisateur peut naviguer ou envoyer un formulaire, par exemple.
form-actionRestreint les URL qui peuvent être utilisées comme cibles pour envoyer des formulaires depuis un contexte donné.
frame-ancestorsDéfinit les parents valides qui peuvent intégrer une page grâce aux éléments
<frame>,<iframe>,<object>, ou<embed>.
Directives de rapport
Les directives de rapport contrôlent l'URL de destination pour les rapports d'enfreinte CSP dansContent-Security-Policy etContent-Security-Policy-Report-Only.
report-toFournit au navigateur un jeton identifiant le point de terminaison de rapport ou le groupe de points de terminaison auquel envoyer les informations d'enfreinte CSP. Les points de terminaison représentés par le jeton sont fournis par d'autres en-têtes HTTP, tels que
Reporting-EndpointsetReport-ToObsolète.Attention :Cette directive est destinée à remplacer
report-uri; dans les navigateurs qui prennent en chargereport-to, la directivereport-uriest ignorée.Cependant, tant quereport-ton'est pas largement supportée, il est recommandé de spécifier les deux en-têtes comme illustré (oùnom_point_de_terminaisonest le nom d'un point de terminaison fourni séparément) :httpContent-Security-Policy: …; report-uri https://endpoint.exemple.com; report-to nom_point_de_terminaison
Autres directives
require-trusted-types-forImplique l'utilisation deTypes de confiance sur les puits d'injection XSS du DOM.
trusted-typesUtilisée pour définir une liste blanche de règles detypes de confiance.Les types de confiance permettent aux applications de verrouiller les puits d'injection XSS du DOM pour n'accepter que des valeurs typées et non falsifiables à la place des chaînes de caractères.
upgrade-insecure-requestsIndique à l'agent utilisateur de traiter toutes les URL non-sécurisées d'un site (celles servies via HTTP) comme si elles avaient été remplacées par des URL sécurisées (celles servies via HTTPS).Cette directive est destinée aux sites web qui possèdent un grand nombre d'URL historiques non-sécurisées devant être réécrites.
Directives obsolètes
block-all-mixed-contentObsolèteEmpêche le chargement de toute ressource via HTTP lorsque la page est chargée avec HTTPS.
report-uriObsolèteFournit au navigateur une URL où les rapports d'enfreinte CSP doivent être envoyés.Cette directive est remplacée par la directive
report-to.
Syntaxe des directives de récupération
Toutes les directives de récupération peuvent être définies de l'une des façons suivantes :
- la valeur unique
'none', indiquant que le type de ressource concerné doit être complètement bloqué - une ou plusieurs valeurs d'expression de source, indiquant les sources valides pour ce type de ressource.
Chaque expression de source prend l'une des formes listées ci-dessous. Notez que toutes les formes ne sont pas applicables à toutes les directives de récupération : consultez la documentation de chaque directive pour savoir quelles formes lui sont applicables.
Les formats<host-source> et<scheme-source> doivent être non entourés de guillemets, et tous les autres formats doivent être entourés de guillemets simples.
nonce-<nonce_value>
Cette valeur consiste en la chaîne de caractèresnonce- suivie d'une valeur denombre unique. La valeur du nonce peut utiliser n'importe quel caractère de laBase64 ou de laBase64 sûre pour les URL.
Cette chaîne de caractères est une valeur aléatoire que le serveur génère pour chaque réponse HTTP. Par exemple :
'nonce-416d1177-4d12-4e3b-b7c9-f6c409789fb8'
Le serveur peut alors inclure cette même valeur comme valeur de l'attributnonce de toute ressource<script> ou<style> qu'il souhaite charger depuis le document.
Le navigateur compare la valeur de la directive CSP avec la valeur de l'attribut de l'élément, et ne charge la ressource que si elles correspondent.
Si une directive contient un nombre unique etunsafe-inline, alors le navigateur ignoreunsafe-inline.
Voir la sectionNombres uniques du guide CSP pour plus d'informations d'utilisation.
<hash_algorithm>-<hash_value>
Cette valeur consiste en une chaîne de caractères identifiant un algorithme de hachage, suivie de-, puis d'une valeur de hachage. La valeur de hachage peut utiliser n'importe quel caractère de laBase64 ou de laBase64 sûre pour les URL.
- L'identifiant de l'algorithme de hachage doit être l'un des suivants entre
sha256,sha384ousha512. - La valeur de hachage est le résultat en base64 de lafonction de hachage d'une ressource
<script>ou<style>, calculée à l'aide de l'une des fonctions de hachage suivantes : SHA-256, SHA-384 ou SHA-512.
Par exemple :
'sha256-cd9827ad...'
Lorsque le navigateur reçoit le document, il effectue le hachage du contenu de chaque élément<script> et<style>, compare le résultat avec les hachages présents dans la directive CSP, et ne charge la ressource que s'il y a correspondance.
Si l'élément charge une ressource externe (par exemple, via l'attributsrc), alors l'élément doit également avoir l'attributintegrity renseigné.
Si une directive contient une valeur de hachage etunsafe-inline, alors le navigateur ignoreunsafe-inline.
Voir la sectionHachages du guide CSP pour plus d'informations d'utilisation.
<host-source>
UneURL ou adresse IP d'unhôte qui est une source valide pour la ressource.
Le schéma, le numéro de port et le chemin sont optionnels.
Si le schéma est omis, celui de l'origine du document est utilisé.
Lors de la comparaison des schémas, les mises à niveau sécurisées sont autorisées. Par exemple :
http://exemple.comautorisera également les ressources provenant dehttps://exemple.comws://exemple.orgautorisera également les ressources provenant dewss://exemple.org.
Les jokers ('*') peuvent être utilisés pour les sous-domaines, l'adresse de l'hôte et le numéro de port, indiquant que toutes les valeurs légales de chacun sont valides. Par exemple :
http://*.exemple.comautorise les ressources provenant de n'importe quel sous-domaine deexemple.com, en HTTP ou HTTPS.
Les chemins qui se terminent par/ correspondent à tout chemin dont ils sont le préfixe. Par exemple :
exemple.com/api/autorisera les ressources provenant deexemple.com/api/users/new.
Les chemins qui ne se terminent pas par/ sont comparés exactement. Par exemple :
https://exemple.com/file.jsautorise les ressources provenant dehttps://exemple.com/file.jsmais pas dehttps://exemple.com/file.js/file2.js.
<scheme-source>
Unschéma, tel quehttps:. Les deux-points sont obligatoires.
Les mises à niveau sécurisées sont autorisées, donc :
http:autorisera également les ressources chargées en HTTPSws:autorisera également les ressources chargées en WSS.
self
Les ressources du type donné ne peuvent être chargées que depuis la mêmeorigine que le document.
Les mises à niveau sécurisées sont autorisées. Par exemple :
- Si le document est servi depuis
http://exemple.com, alors une CSP avec'self'autorisera également les ressources provenant dehttps://exemple.com. - Si le document est servi depuis
ws://exemple.org, alors une CSP avec'self'autorisera également les ressources provenant dewss://exemple.org.
trusted-types-eval
Par défaut, si une CSP contient une directivedefault-src ouscript-src, alors les fonctions JavaScript qui évaluent leurs arguments comme du JavaScript sont désactivées.Cela incluteval(), l'argumentcode desetTimeout(), ou le constructeurFunction().
Le mot-clétrusted-types-eval peut être utilisé pour annuler cette protection, mais uniquement lorsque lesTypes de confiance sont appliqués et transmis à ces fonctions à la place de chaînes de caractères.Cela permet l'évaluation dynamique de chaînes de caractères comme JavaScript, mais seulement après que les entrées ont été transmises à une fonction de transformation avant injection, ce qui permet denettoyer l'entrée pour supprimer tout balisage potentiellement dangereux.
Le mot-clétrusted-types-eval doit être utilisé à la place de'unsafe-eval' lors de l'utilisation de ces méthodes avec des types de confiance.Cela garantit que l'accès à ces méthodes est bloqué sur les navigateurs qui ne prennent pas en charge les types de confiance.
Note :Il convient d'éviter d'utilisertrusted-types-eval ou ces méthodes sauf si cela est absolument nécessaire.Les types de confiance garantissent que l'entrée passe par une fonction de transformation — ils ne garantissent pas que la transformation rend l'entrée sûre (et cela peut être très difficile à réaliser correctement).
Voir la sectioneval() et API similaires du guide CSP pour plus d'informations d'utilisation.
unsafe-eval
Par défaut, si une CSP contient une directivedefault-src ouscript-src, alors les fonctions JavaScript qui évaluent leurs arguments comme du JavaScript sont désactivées.Cela incluteval(), l'argumentcode desetTimeout(), ou le constructeurFunction().
Le mot-cléunsafe-eval peut être utilisé pour annuler cette protection, permettant l'évaluation dynamique de chaînes de caractères comme JavaScript.
Attention :Les développeur·euse·s doivent éviter d'utiliser'unsafe-eval', car cela annule en grande partie l'intérêt d'une CSP.'trusted-types-eval' offre une alternative « potentiellement » plus sûre si l'utilisation de ces méthodes est nécessaire.
Voir la sectioneval() et API similaires du guide CSP pour plus d'informations d'utilisation.
wasm-unsafe-eval
Par défaut, si une CSP contient une directivedefault-src ouscript-src, alors une page ne pourra pas compiler du WebAssembly à l'aide de fonctions commeWebAssembly.compileStreaming().
Le mot-cléwasm-unsafe-eval peut être utilisé pour annuler cette protection. Il s'agit d'une alternative bien plus sûre à'unsafe-eval', car cela n'active pas l'évaluation générale du JavaScript.
unsafe-inline
Par défaut, si une CSP contient une directivedefault-src ouscript-src, alors le JavaScript en ligne n'est pas autorisé à s'exécuter. Cela inclut :
- les balises
<script>en ligne - les attributs de gestionnaire d'évènements en ligne
- les URL
#"/fr/docs/Web/API/HTMLElement/style" title="style">style.
Le mot-cléunsafe-inline peut être utilisé pour annuler cette protection, permettant à toutes ces formes d'être chargées.
Attention :Les développeur·euse·s doivent éviter'unsafe-inline', car cela annule en grande partie l'intérêt d'une CSP.
Voir la sectionJavaScript en ligne du guide CSP pour plus d'informations d'utilisation.
unsafe-hashes
Par défaut, si une CSP contient une directivedefault-src ouscript-src, alors les attributs de gestionnaire d'évènements en ligne commeonclick et les attributsstyle en ligne ne sont pas autorisés à s'exécuter.
L'expression'unsafe-hashes' permet au navigateur d'utiliser desexpressions de hachage pour les gestionnaires d'évènements en ligne et les attributsstyle. Par exemple, une CSP peut contenir une directive comme :
script-src 'unsafe-hashes' 'sha256-cd9827ad...'Si la valeur de hachage correspond au hachage de la valeur d'un attribut de gestionnaire d'évènements en ligne ou d'un attributstyle, alors le code sera autorisé à s'exécuter.
Attention :La valeur'unsafe-hashes' n'est pas sûre.
En particulier, cela permet une attaque dans laquelle le contenu de l'attribut de gestionnaire d'évènements en ligne est injecté dans le document comme un élément<script> en ligne. Supposons que le gestionnaire d'évènements en ligne soit :
<button>Transférer tout mon argent</button>Si un·e attaquant·e peut injecter un élément<script> en ligne contenant ce code, la CSP autorisera son exécution automatiquement.
Cependant,'unsafe-hashes' est bien plus sûr que'unsafe-inline'.
inline-speculation-rules
Par défaut, si une CSP contient une directivedefault-src ouscript-src, alors le JavaScript en ligne n'est pas autorisé à s'exécuter. L'expression'inline-speculation-rules' permet au navigateur de charger des éléments<script> en ligne qui ont un attributtype despeculationrules.
Voir la sectionAPI Speculation Rules pour plus d'informations.
strict-dynamic
Le mot-clé'strict-dynamic' fait en sorte que la confiance conférée à un script par unnombre unique ou unhachage s'étende aux scripts que ce script charge dynamiquement, par exemple en créant de nouvelles balises<script> à l'aide deDocument.createElement() puis en les insérant dans le document avecNode.appendChild().
Si ce mot-clé est présent dans une directive, alors les valeurs d'expression de source suivantes sont toutes ignorées :
Voir la sectionLe mot-cléstrict-dynamic du guide CSP pour plus d'informations d'utilisation.
report-sample
Si cette expression est incluse dans une directive contrôlant les scripts ou les styles, et que la directive entraîne le blocage par le navigateur de tout script en ligne, style en ligne ou attribut de gestionnaire d'évènements en ligne, alors lerapport de violation généré par le navigateur contiendra une propriétésample contenant les 40 premiers caractères de la ressource bloquée.
Le CSP dans les workers
En général, lesworkers ne sont pas régis par la politique de sécurité du contenu du document (ou du worker parent) qui les a créés. Pour définir une politique de sécurité du contenu pour le worker, il faut définir un en-tête de réponseContent-Security-Policy pour la requête qui a demandé le script du worker.
L'exception à cette règle concerne le cas où l'origine du script du worker est un identifiant global unique (par exemple, si son URL utilise un schéma de type data ou blob). Dans ce cas, le worker hérite de la politique de sécurité du contenu du document ou du worker qui l'a créé.
Gérer plusieurs politiques de sécurité
Le mécanisme CSP permet d'indiquer plusieurs politiques pour une ressource, notamment via l'en-têteContent-Security-Policy, l'en-têteContent-Security-Policy-Report-Only et l'élément<meta>.
Vous pouvez utiliser l'en-têteContent-Security-Policy plusieurs fois, comme dans l'exemple ci-dessous. Portez une attention particulière à la directiveconnect-src ici. Même si la deuxième politique autorise la connexion, la première politique contientconnect-src 'none'. Ajouter des politiques supplémentairesne peut que restreindre davantage les capacités de la ressource protégée, ce qui signifie qu'aucune connexion ne sera autorisée et, en tant que politique la plus stricte,connect-src 'none' sera appliquée.
Content-Security-Policy: default-src 'self' http://exemple.com; connect-src 'none';Content-Security-Policy: connect-src http://exemple.com/; script-src http://exemple.com/Exemples
>Désactiver le code en ligne non sûr et n'autoriser que les ressources HTTPS
Cet en-tête HTTP définit la politique par défaut pour n'autoriser le chargement des ressources (images, polices, scripts, etc.) qu'en HTTPS.Comme les directivesunsafe-inline etunsafe-eval ne sont pas définies, les scripts en ligne seront bloqués.
Content-Security-Policy: default-src https:Les mêmes restrictions peuvent être appliquées à l'aide de l'élément HTML<meta>.
<meta http-equiv="Content-Security-Policy" content="default-src https:" />Autoriser le code en ligne et les ressources HTTPS, mais désactiver les plugins
Cette politique peut être utilisée sur un site existant qui utilise trop de code en ligne pour être corrigé, afin de s'assurer que les ressources sont chargées uniquement via HTTPS et de désactiver les plugins :
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'Signaler mais ne pas appliquer les violations lors des tests
Cet exemple applique les mêmes restrictions que l'exemple précédent, mais utilise l'en-têteContent-Security-Policy-Report-Only et la directivereport-to.Cette approche est utilisée lors des tests pour signaler les violations sans bloquer l'exécution du code.
Les points de terminaison (URL) vers lesquels envoyer les rapports sont définis à l'aide de l'en-tête de réponse HTTPReporting-Endpoints.
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"Un point de terminaison particulier est ensuite sélectionné comme cible de rapport dans la politique CSP à l'aide de la directivereport-to.
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-url/; report-to csp-endpointNotez que la directivereport-uriObsolète est également définie ci-dessus carreport-to n'est pas encore largement pris en charge par les navigateurs.
VoirMise en œuvre de la Content Security Policy (CSP) pour plus d'exemples.
Spécifications
| Specification |
|---|
| Content Security Policy Level 3> # csp-header> |
Compatibilité des navigateurs
Voir aussi
- L'en-tête
Content-Security-Policy-Report-Only - Apprendre : Content Security Policy
- Sécurité du contenu dans les WebExtensions
- Adopter une politique stricte(angl.)
- Évaluateur CSP(angl.) - Évaluer votre politique de sécurité du contenu