Aller au contenu
🚀 10 outils en ligne, gratuits pour toujours — et la liste s’allonge
Accueil›Blog›En-têtes de sécurité HTTP : guide complet de CSP, HSTS et des autres
Guides

En-têtes de sécurité HTTP : guide complet de CSP, HSTS et des autres

Une poignée d’en-têtes de réponse décide si un navigateur exécutera un script injecté, placera vos pages dans une iframe ou retombera en HTTP non chiffré. Ce guide explique le rôle de chacun, lesquels valent l’effort, et comment déployer une CSP stricte sans rien casser.

✍ Par le fondateur et PDG, équipe BuildToolForge🗓 2026-10-12⏱ 12 min
securitycsphstsheadershttp
Guide de sécurité web2026

En-têtes de sécurité
En pratique

CSP, HSTS et les quatre petits en-têtes, expliqués ligne par ligne

Politiques prêtes à copier · Plan de déploiement · Sans inscription

curl -I · example.com
$ curl -I https://example.com
CSPdefault-src 'self'nonce
HSTSmax-age=31536000
XCTOnosniff
Refstrict-origin-when-cross
✓ 6 en-têtes sur 6 présents · sans unsafe-inline
Les en-têtes
CSP
Ce qui peut charger
HSTS
HTTPS uniquement
XCTO
Pas de devinette MIME
Referrer
Ce qui fuit
Permissions
Accès aux appareils
COOP
Isolation des fenêtres
Bloque les scripts injectésEmpêche le retour en HTTPPrévient le clickjackingLimite les fuites de donnéesGratuit à vérifier

L’essentiel de la sécurité d’un site vit dans son code, mais un petit ensemble d’en-têtes de réponse HTTP décide de ce que le navigateur acceptera de faire avec ce code une fois reçu. Ils font la différence entre un <script> injecté qui s’exécute et un que le navigateur refuse d’exécuter, entre une première visite en HTTP non chiffré et une visite basculée en HTTPS avant même de quitter la barre d’adresse.

Ils sont aussi exceptionnellement peu coûteux à déployer. Un en-tête est de la configuration, pas du code : la plupart tiennent en une ligne dans votre serveur web, votre CDN ou votre framework, et s’appliquent d’un coup à toutes les réponses. Ce guide couvre le rôle de chaque en-tête, lesquels sont rentables, comment déployer une Content-Security-Policy sans casser votre propre site, et comment vérifier ce que vous envoyez aujourd’hui.

Pourquoi les en-têtes de sécurité comptent

Un en-tête est une instruction au navigateur, et le navigateur est le seul acteur capable de l’appliquer sur la machine de l’utilisateur. Cela en fait une seconde ligne de défense qui tient même lorsque quelque chose en amont a déjà échoué :

  • Ils contiennent les erreurs déjà commises. Une Content-Security-Policy ne corrige pas une faille XSS, mais elle peut empêcher le script injecté de s’exécuter ou de renvoyer quoi que ce soit.
  • Ils ferment des classes entières d’attaques. Le clickjacking, la confusion de type MIME et le retour en HTTP ne sont pas des bogues de votre code : ce sont des comportements du navigateur dont il faut explicitement se retirer.
  • Ils stoppent les fuites discrètes de données. Sans politique de référent, l’URL complète d’une page privée voyage vers chaque tiers dont vous chargez une image.
  • C’est la première chose qu’un auditeur regarde. Les en-têtes manquants apparaissent dans chaque scan automatique, questionnaire de sécurité et revue fournisseur, parce que c’est le constat le moins coûteux à faire.

Le piège, c’est qu’il est facile de les rendre presque corrects. Une CSP avec unsafe-inline ne bloque presque rien ; un en-tête HSTS d’une durée d’un jour ne protège quasiment personne. Toute la valeur est dans les détails.

Les en-têtes qui comptent le plus

Six en-têtes font presque tout le travail utile. Les autres sont hérités, de portée très étroite, ou dépassés.

En-têteCe qu’il empêcheEffort
Content-Security-PolicyXSS, exfiltration de données, code tiers inattenduÉlevé
Strict-Transport-SecurityRetour en HTTP, vol de cookie à la première requêteFaible
X-Content-Type-OptionsQu’un fichier déposé soit exécuté comme scriptNégligeable
Referrer-PolicyFuite d’URL complètes vers des tiersNégligeable
Permissions-PolicyAccès caméra, micro et géolocalisationFaible
Cross-Origin-Opener-PolicyAttaques inter-fenêtres depuis les pages ouvertesFaible

Commencez par le bas. Les quatre en-têtes bon marché tiennent en une ligne chacun et ne cassent presque jamais rien : ils méritent d’être livrés aujourd’hui. La CSP est celle qui demande un plan.

Content-Security-Policy

La CSP est une liste d’autorisations qui indique au navigateur d’où chaque type de ressource peut venir. Une politique raisonnablement stricte ressemble à ceci :

default-src 'self'; script-src 'self' 'nonce-r4nd0m'; style-src 'self'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; object-src 'none'

Lisez-la directive par directive. default-src 'self' est le repli : tout ce qui n’est pas nommé explicitement ne peut charger que depuis votre propre origine. script-src est la plus importante, car ce sont les scripts qu’un attaquant veut exécuter. frame-ancestors 'none' interdit à tout autre site de placer votre page dans une iframe : c’est le remplaçant moderne de X-Frame-Options. object-src 'none' et base-uri 'self' ferment deux vieux contournements qu’il ne coûte rien de condamner.

Deux valeurs décident si votre politique est réelle. 'unsafe-inline' dans script-src autorise n’importe quel <script> en ligne, y compris celui qu’un attaquant a injecté, c’est-à-dire précisément ce que la CSP est censée empêcher. 'unsafe-eval' autorise eval() et ses proches. Une politique contenant l’un ou l’autre reste utile pour les directives hors script, mais elle ne vous protège pas du XSS.

La sortie, c’est un nonce ou un hash. Un nonce est une valeur aléatoire générée par réponse et attachée à la fois à l’en-tête et à chaque <script nonce="..."> légitime ; le navigateur n’exécute que les scripts portant cette valeur, qu’un script injecté ne peut pas deviner. Les hash fonctionnent de même pour des scripts qui ne changent jamais. Si votre framework rend des scripts en ligne, il gère presque certainement déjà les nonces : il suffit souvent d’activer une option.

Strict-Transport-Security

HSTS demande au navigateur de refuser le HTTP non chiffré pour votre domaine pendant une durée donnée, ce qui ferme la brèche qu’une simple redirection laisse ouverte : la toute première requête, avant l’arrivée de la redirection, voyage en clair et peut être interceptée.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Le max-age est en secondes ; un an est la cible habituelle, et en dessous de quelques mois l’apport est faible. includeSubDomains étend la règle à tous les sous-domaines, ce qui la rend efficace et mérite d’être vérifié d’abord : tout sous-domaine encore servi en HTTP cessera de fonctionner. preload demande l’inscription dans la liste livrée avec les navigateurs, pour que même la première visite soit protégée.

Traitez HSTS comme difficile à annuler. Un navigateur ayant vu une politique d’un an l’appliquera un an, quoi que vous envoyiez ensuite. Déployez-la avec un max-age court, vérifiez que rien n’a cassé, puis augmentez-le. Et comme HSTS n’a d’intérêt que si le certificat derrière est valide, vérifiez le certificat et son expiration avec le vérificateur de certificats SSL avant de vous engager sur une longue durée.

Les petits en-têtes

Ces quatre-là tiennent en une ligne chacun et sont rarement sujets à débat :

  • X-Content-Type-Options: nosniff — empêche le navigateur de deviner le type d’une réponse d’après son contenu. Sans lui, un fichier déposé en .txt peut être exécuté comme script si le navigateur décide qu’il y ressemble.
  • Referrer-Policy: strict-origin-when-cross-origin — envoie l’URL complète à votre propre origine, seulement l’origine aux autres sites HTTPS, et rien lors d’un passage en HTTP. C’est le défaut moderne, et il empêche les chemins et paramètres privés de fuir vers des tiers.
  • Permissions-Policy: camera=(), microphone=(), geolocation=() — désactive les fonctions matérielles que votre site n’utilise pas, pour votre page comme pour ce que vous intégrez.
  • Cross-Origin-Opener-Policy: same-origin — coupe le lien de fenêtre avec les pages que vous ouvrez ou qui vous ouvrent, ce qui bloque une famille d’attaques inter-fenêtres et conditionne certaines fonctions d’isolation du navigateur.

X-Frame-Options: DENY a encore sa place pour les navigateurs anciens, mais frame-ancestors dans votre CSP le remplace et est plus expressif. Envoyez les deux : ils n’entrent pas en conflit.

Déployer une CSP sans risque

Une CSP écrite au hasard bloquera quelque chose dont votre propre site a besoin. La voie du « rapport d’abord » évite cela entièrement :

  1. Livrez aujourd’hui les quatre en-têtes bon marché. nosniff, une politique de référent, une politique de permissions et HSTS avec un max-age court. Aucun ne casse normalement un site qui fonctionne.
  2. Ajoutez Content-Security-Policy-Report-Only. Syntaxe identique, mais le navigateur signale les violations au lieu de les bloquer. Votre site se comporte exactement comme avant.
  3. Collectez les rapports une à deux semaines. Ils nommeront chaque script tiers, police, point d’analytique et gestionnaire en ligne que vous aviez oublié. C’est l’étape que l’on saute, et c’est elle qui rend la suite indolore.
  4. Resserrez jusqu’au silence des rapports. Ajoutez les sources dont vous avez réellement besoin et retirez celles dont vous découvrez que non. Résistez à l’envie d’élargir une directive à * pour faire taire un seul rapport.
  5. Passez en mode appliqué. Renommez l’en-tête en Content-Security-Policy. Gardez la version report-only à côté pour tester plus tard une politique plus stricte.
  6. Retirez unsafe-inline en dernier. C’est le vrai travail : déplacer les scripts en ligne vers des fichiers ou leur donner des nonces. Tout ce qui précède n’est que préparation ; c’est cette étape qui arrête le XSS.

Une remarque pratique : les en-têtes sont par réponse, donc posez-les en périphérie — CDN, proxy inverse ou middleware du framework — et non page par page. Le faire en un seul endroit est aussi le seul moyen d’être sûr que vos pages d’erreur et vos redirections les portent aussi, et c’est précisément là qu’ils manquent d’habitude.

Les en-têtes que vous pouvez arrêter d’envoyer

Certains conseils ont mal vieilli, et envoyer un en-tête mort n’est pas sans conséquence : cela ajoute des octets et fait paraître un audit terminé alors qu’il ne l’est pas.

  • X-XSS-Protection — les filtres du navigateur qu’il pilotait ont disparu. Il ne fait rien dans aucun navigateur actuel, et l’ancienne valeur mode=block a même introduit ses propres problèmes. Retirez-le et appuyez-vous sur la CSP.
  • Public-Key-Pins — HPKP a été retiré des navigateurs. Il était facile de se verrouiller hors de son propre domaine, d’où son abandon.
  • Expect-CT — la transparence des certificats est désormais appliquée par défaut, l’en-tête est donc redondant.
  • Feature-Policy — renommé Permissions-Policy, avec une autre syntaxe. Envoyez le nouveau ; ne gardez l’ancien que si vous devez supporter quelque chose de très vieux.

À l’inverse, une chose mérite d’être retirée : l’information que vous offrez. Un en-tête Server ou X-Powered-By nommant la version exacte de votre framework indique à un attaquant quels exploits essayer en premier. Ce n’est pas une vulnérabilité, mais il n’y a aucune raison de le publier.

Comment vérifier vos propres en-têtes

Les en-têtes sont publics : vérifier la configuration d’un site prend quelques secondes.

  1. curl -I https://example.com. Une requête HEAD affiche tous les en-têtes de réponse sans télécharger la page. Ajoutez -L pour inspecter l’URL finale plutôt qu’une redirection.
  2. Le panneau réseau du navigateur. Ouvrez les outils de développement, rechargez, sélectionnez le document principal et lisez la section des en-têtes de réponse. La console journalise aussi chaque violation de CSP avec la directive qui a bloqué, ce qui est le moyen le plus rapide de déboguer une politique.
  3. Un vérificateur qui note le résultat. Notre vérificateur d’en-têtes de sécurité interroge une URL et indique quels en-têtes sont présents, lesquels manquent, et où un en-tête présent est plus faible qu’il n’y paraît.

Ne vérifiez pas seulement votre page d’accueil. Les en-têtes sont souvent posés sur l’application principale mais pas sur les hôtes de ressources statiques, les pages d’erreur, les sous-domaines d’API ou la redirection qui mène de www au domaine racine. Pendant que vous y êtes, vérifiez que la chaîne de redirection elle-même est correcte ; la référence des codes de statut HTTP précise quel code convient à un déplacement définitif.

Pour écrire une politique sans apprendre la syntaxe, partez de notre générateur CSP, qui signale aussi les réglages qui l’affaiblissent.

Erreurs courantes à éviter

  • Une CSP avec unsafe-inline dans script-src. Elle passe la plupart des contrôles automatiques et n’arrête presque aucun XSS. Utilisez un nonce ou des hash.
  • Élargir une directive à * pour corriger un rapport. Ajoutez plutôt l’origine précise ; * abandonne complètement la directive.
  • HSTS avec un max-age long dès le premier jour. C’est de fait irréversible pour la durée publiée. Commencez court.
  • includeSubDomains avant d’auditer les sous-domaines. Tout ce qui reste en HTTP, outils internes compris, cesse de charger.
  • Des en-têtes sur l’application mais pas en périphérie. Les pages d’erreur, les redirections et les hôtes de ressources finissent non protégés, et ce sont justement les réponses que visent les attaquants.
  • Envoyer deux fois le même en-tête. Deux en-têtes CSP sont intersectés, pas fusionnés : le résultat est plus strict que chacun et casse souvent quelque chose ; deux valeurs contradictoires de X-Frame-Options peuvent être entièrement ignorées.
  • Continuer à livrer X-XSS-Protection et s’en satisfaire. Un en-tête mort donne une fausse assurance dans un rapport.
  • Ne jamais dépasser le mode report-only. Des rapports sur lesquels on n’agit pas ne protègent personne.

Vérifiez vos en-têtes

Les en-têtes de sécurité offrent le meilleur rapport protection/effort du web : quatre d’entre eux tiennent en une ligne, et le cinquième, la CSP, consiste surtout à écouter vos propres rapports de violation avant d’appliquer quoi que ce soit. Commencez par regarder ce que votre site envoie aujourd’hui, ajoutez immédiatement les en-têtes bon marché, puis mettez en place une CSP en report-only et laissez-la vous dire ce que votre politique doit contenir.

Outils et guides associés :

Questions fréquentes

Quels en-têtes de sécurité ajouter en premier ?⌄

Commencez par les quatre qui ne cassent presque jamais rien : X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, une Permissions-Policy qui désactive les fonctions matérielles inutilisées, et Strict-Transport-Security avec un max-age court que vous augmenterez. Ajoutez ensuite une Content-Security-Policy en mode report-only, car c’est celle qui demande de l’observation avant d’être appliquée.

Une CSP avec unsafe-inline sert-elle encore ?⌄

Elle sert pour tout, sauf pour l’attaque que la CSP arrête le mieux. Des directives comme img-src, connect-src, frame-ancestors et object-src contraignent toujours où les données peuvent aller et qui peut vous encadrer. Mais 'unsafe-inline' dans script-src autorise l’exécution de n’importe quel script en ligne injecté : la politique ne vous protège donc pas du XSS. Remplacez-le par un nonce par réponse ou des hash de script.

Strict-Transport-Security est-il risqué ?⌄

Il est risqué surtout parce qu’il est difficile à défaire : un navigateur ayant vu max-age=31536000 refusera le HTTP non chiffré pour votre domaine pendant un an, quoi que vous envoyiez ensuite. Déployez-le d’abord avec un max-age court, vérifiez que tous les sous-domaines sont joignables en HTTPS avant d’ajouter includeSubDomains, et seulement ensuite augmentez la durée et envisagez preload.

Qu’est-ce qui remplace X-Frame-Options et X-XSS-Protection ?⌄

La directive frame-ancestors de Content-Security-Policy remplace X-Frame-Options et est plus expressive, même si envoyer les deux est sans danger et aide encore les navigateurs anciens. X-XSS-Protection n’a pas de remplaçant car les filtres du navigateur qu’il pilotait ont été supprimés ; c’est la CSP qui arrête le XSS aujourd’hui, et l’ancien en-tête peut simplement être retiré.

Où faut-il poser les en-têtes de sécurité ?⌄

En périphérie, en un seul endroit : votre CDN, votre proxy inverse ou le middleware de votre framework. Les poser page par page laisse vos pages d’erreur, vos redirections, vos hôtes de ressources et vos réponses d’API à découvert, et ce sont exactement les réponses oubliées lors d’un audit et visées lors d’une attaque.

Comment savoir quels en-têtes mon site envoie ?⌄

Lancez curl -I https://votredomaine.com en ajoutant -L pour voir la destination finale plutôt qu’une redirection, ou ouvrez le panneau réseau du navigateur et lisez les en-têtes de réponse du document principal. Le vérificateur d’en-têtes de sécurité le fait depuis votre navigateur et signale à la fois les en-têtes manquants et ceux, présents, qui sont plus faibles qu’ils n’y paraissent.

À propos de l'auteur
Fondateur et PDG, BuildToolForge
Suivez-nous sur X : @Buildtoolforge

Plus de 15 ans d'expérience pratique en développement web et en sécurité. Spécialisé dans la sécurité web concrète : garder les sites sûrs, fiables et faciles à diagnostiquer. BuildToolForge existe pour rendre ces vérifications gratuites, privées et compréhensibles. Les outils s'exécutent dans votre navigateur dès que possible, et rien de ce que vous saisissez dans un outil n'est conservé.

Comment nous rédigeons nos guides : Chaque guide s'appuie sur une expérience de terrain, est vérifié par rapport aux normes officielles et testé avec nos propres outils sur de vrais domaines. Nous mettons les guides à jour quand les normes ou les outils évoluent. Une erreur ? Écrivez-nous à contact@buildtoolforge.com.

Dernière mise à jour : 2 novembre 2026