Poser des en-têtes de sécurité sans casser son site
Un en-tête de sécurité ne se voit pas. C'est exactement pour ça qu'il manque sur trois sites sur quatre : personne ne se plaint de son absence, et celui qui en pose un mal éteint son site en direct. Ce mémo donne l'ordre dans lequel les poser, du plus sûr au plus risqué, et la seule méthode qui permet d'essayer sans conséquence.
Avant d'appliquer ce mémo
Les manipulations décrites ici peuvent entraîner une perte de données ou l'indisponibilité d'un service. Avant d'en appliquer une seule : faites une sauvegarde complète et vérifiez qu'elle se restaure, travaillez d'abord sur un environnement sans enjeu, et n'exécutez aucune commande dont vous ne comprenez pas l'effet.
Ce mémo est un contenu pédagogique de portée générale. Il ne tient pas compte de votre situation, n'a pas valeur de conseil professionnel, et son application relève de votre seule responsabilité. Avertissement et limites d'usage
1. Une consigne que votre serveur murmure Et que votre visiteur ne verra jamais
Quand un navigateur demande une page, votre serveur ne renvoie pas seulement du HTML. Il renvoie d'abord une poignée de lignes que personne ne lit, les en-têtes de réponse, et parmi elles il peut glisser des consignes : « n'affiche cette page dans le cadre d'aucun autre site », « ne devine jamais le type d'un fichier », « n'exécute que les scripts qui viennent de chez moi ». Le navigateur obéit. Sans ces consignes, il fait ce qu'il a toujours fait, c'est-à-dire à peu près tout ce qu'on lui demande.
C'est une protection qui ne coûte presque rien, qui ne ralentit pas le site, qui ne demande aucun abonnement. Et elle manque partout. Pas par négligence : parce qu'un en-tête absent ne provoque aucune plainte, aucune erreur, aucune alerte. Il ne se voit qu'au moment où quelqu'un s'en sert contre vous, et ce jour-là il est trop tard pour le poser.
2. Où en est le web, vraiment Les chiffres avant les conseils
Le HTTP Archive analyse chaque année plusieurs millions de sites et publie ses relevés. Voici l'état des lieux de son édition 2025, sur les pages consultées depuis un mobile. Lisez la deuxième colonne comme la probabilité que votre propre site soit dans le même cas.
| En-tête | Pages qui le posent | Ce qu'il fait, en une phrase |
|---|---|---|
| X-Content-Type-Options | environ 50 % | Interdit au navigateur de deviner le type d'un fichier, donc d'exécuter comme script ce qui était déclaré comme image. |
| Strict-Transport-Security HSTS |
36 % six points de plus que l'édition précédente |
Oblige le navigateur à ne plus jamais parler à votre domaine en clair, même si on lui donne une adresse en http://. |
| X-Frame-Options | environ 35 % | Empêche un autre site d'afficher vos pages dans un cadre invisible pour piéger les clics de vos visiteurs. |
| Content-Security-Policy la CSP |
21,9 % 18,5 % un an plus tôt |
Déclare d'où les scripts, styles et images ont le droit de venir. Le plus puissant, et le plus délicat. |
| Permissions-Policy | 3,7 % | Coupe l'accès à la caméra, au micro, à la géolocalisation pour les pages qui n'en ont pas besoin. |
unsafe-inline dans la directive qui contrôle les scripts, et seulement 10 % environ utilisent le mécanisme qui rend cette mention inoffensive. Autrement dit : l'immense majorité des CSP déployées sur le web ne protègent de rien du tout. Elles rassurent leur propriétaire, elles apparaissent dans les rapports d'audit comme « présentes », et elles laissent passer exactement ce qu'elles étaient censées bloquer. Nous y revenons en section 6.3. Les six qui comptent, dans l'ordre où les poser Du plus sûr au plus risqué
Cet ordre n'est pas celui de l'efficacité, c'est celui du risque. Les trois premiers ne peuvent pratiquement rien casser et se posent en cinq minutes. Le quatrième engage votre domaine pour des mois. Les deux derniers demandent de regarder ce que fait votre site avant de décider.
1 X-Content-Type-Options
X-Content-Type-Options: nosniff
Une seule valeur possible, aucun réglage, aucun effet de bord connu sur un site ordinaire. Il interdit au navigateur de « renifler » le contenu d'un fichier pour deviner sa nature : sans lui, un fichier déposé par un visiteur sur votre formulaire et servi comme image peut être exécuté comme du code.
Sans risque À poser en premier
2 Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Décide ce que votre site raconte de lui-même quand un visiteur le quitte par un lien. Sans réglage, l'adresse complète de la page qu'il consultait part chez le site d'arrivée, chemin et paramètres compris. Cette valeur-là n'envoie que le nom de domaine vers l'extérieur, et rien du tout vers un site en clair.
Sans risque
3 X-Frame-Options
X-Frame-Options: SAMEORIGIN
Empêche un site tiers d'afficher vos pages dans un cadre transparent posé sur un autre contenu, technique qui sert à faire cliquer vos visiteurs là où ils ne croient pas cliquer. À ne poser tel quel que si personne n'a légitimement besoin d'intégrer vos pages.
Vérifier d'abord
4 Strict-Transport-Security
Strict-Transport-Security: max-age=31536000; includeSubDomains
Le seul de la liste qui ne se retire pas d'un claquement de doigts. Détaillé en section 5, parce qu'il mérite sa propre page.
Engage votre domaine
5 Permissions-Policy
Permissions-Policy: camera=(), microphone=(), geolocation=()
Ferme les portes que votre site n'utilise pas. Les parenthèses vides veulent dire « personne, pas même moi ». Si vous avez une carte interactive qui demande la position du visiteur, retirez geolocation de la liste ou autorisez-la explicitement.
Lister ce qu'on utilise
6 Content-Security-Policy
Le plus puissant et le seul qui puisse éteindre votre site en une ligne. Sections 6 et 7, entièrement.
À faire en deux temps
4. Ceux qu'il faut retirer Les conseils de 2015 qui traînent encore
La plupart des tutoriels que vous trouverez recopient une liste écrite il y a dix ans. Trois de ces en-têtes sont aujourd'hui inutiles, et le premier est activement déconseillé.
| En-tête | Statut | Quoi en faire |
|---|---|---|
| X-XSS-Protection | Obsolète, et nuisible dans certains cas | Le mécanisme qu'il pilotait, le filtre anti-injection des navigateurs, a été retiré de Chrome et n'a jamais existé dans Firefox. Il introduisait lui-même des failles sur des sites par ailleurs sains. Le retirer, ou le poser explicitement à 0 pour neutraliser un très vieux navigateur. Le poser à 1 en 2026 n'apporte rien. |
| Expect-CT | Obsolète depuis Chromium 107 | Retiré des navigateurs. La transparence des certificats, qu'il servait à exiger, est devenue obligatoire pour tous les certificats. Les outils d'audit le signalent désormais comme une interface dépréciée. |
| Public-Key-Pins HPKP |
Mort et enterré depuis 2018 | Ne jamais déployer. Il permettait de rendre son propre domaine inaccessible pendant des mois sur une erreur de manipulation, ce qui est arrivé assez souvent pour que les navigateurs l'abandonnent. |
Server, X-Powered-By et leurs cousins annoncent en clair la version de votre serveur, de votre PHP ou de votre gestionnaire de contenu. Ce n'est pas une faille, mais c'est une invitation : cela revient à indiquer à un robot d'exploration quelles vulnérabilités connues valent la peine d'être essayées chez vous. Un attaquant les trouvera peut-être autrement, mais il n'y a aucune raison de lui épargner l'effort.5. HSTS, le seul qu'on ne peut pas défaire Et le piège de la liste de préchargement
HSTS dit au navigateur : « à partir de maintenant, et pendant N secondes, refuse de parler à ce domaine autrement qu'en HTTPS ». C'est ce qui bouche le trou que laisse une simple redirection : entre le moment où un visiteur tape votre adresse sans https:// et le moment où votre serveur le redirige, une première requête est partie en clair sur le réseau, et c'est celle-là qu'on intercepte.
La valeur habituelle est max-age=31536000, soit un an. Le point à comprendre, c'est que cette durée est stockée dans le navigateur de chaque visiteur. Si vous décidez demain de repasser une partie du site en HTTP, ou si un sous-domaine perd son certificat, vous ne pouvez pas annuler la consigne chez les gens : leur navigateur refusera de se connecter, et affichera une erreur que rien sur votre site ne peut corriger.
- Commencez à
max-age=300, cinq minutes, le temps de vérifier que tout le site répond bien en HTTPS. - Passez à un an une fois que c'est vérifié.
- N'ajoutez
includeSubDomainsque si tous vos sous-domaines ont un certificat valide, y compris ceux que vous avez oubliés : la recette, l'ancien blog, le webmail, l'outil interne.
6. Pourquoi 92 % des CSP ne protègent de rien Le mot qui annule la politique
La politique de sécurité du contenu déclare d'où votre page a le droit de charger des scripts, des styles, des images, des polices. Sa raison d'être est de rendre inoffensif le scénario le plus courant d'attaque sur un site vitrine : un attaquant parvient à glisser du code dans une de vos pages, par un champ de formulaire mal filtré ou une extension trouée, et ce code s'exécute chez tous vos visiteurs comme s'il venait de vous.
Une CSP bien posée bloque ce code, parce qu'il n'était pas prévu. Le problème est qu'un site ordinaire contient déjà lui-même des dizaines de petits scripts écrits directement dans ses pages, et que la CSP les bloque aussi. Le tutoriel moyen règle la difficulté en une ligne : ajouter 'unsafe-inline' à la directive des scripts. Le site refonctionne, l'en-tête est là, l'audit le voit.
'unsafe-inline' autorise exactement ce contre quoi la CSP existe. Le script injecté par l'attaquant est, lui aussi, un script écrit directement dans la page. En l'ajoutant, on retire au mécanisme sa seule fonction utile. Le nom de la directive le dit d'ailleurs sans détour, et c'est pourtant ce que font 92 % des sites qui déploient une CSP.Il existe deux façons propres de garder ses scripts en ligne sans ouvrir la porte, et elles se combinent :
Le jeton à usage unique
Le serveur tire une valeur aléatoire à chaque affichage de la page, l'écrit dans l'en-tête et sur chacun de ses propres scripts. Le navigateur n'exécute que les scripts qui portent le jeton du jour. Celui de l'attaquant ne peut pas le connaître, puisqu'il change à chaque requête.
La contrainte : la valeur doit être réellement aléatoire et différente à chaque affichage. Un jeton fixe écrit une fois dans un fichier de configuration ne protège de rien, et c'est l'erreur la plus fréquente.
'strict-dynamic'
Dit au navigateur : « un script que j'ai autorisé a le droit d'en charger d'autres ». Sans lui, il faudrait énumérer dans la politique chaque service tiers, chaque réseau de distribution, chaque outil de mesure, et recommencer à chaque changement.
Le bénéfice caché : sa présence fait ignorer 'unsafe-inline' par les navigateurs récents. On peut donc laisser ce dernier pour les navigateurs anciens sans perdre la protection sur les autres.
7. La méthode qui permet d'essayer sans conséquence Observer avant d'appliquer
C'est le point que ce mémo existe pour transmettre. La CSP possède un mode où elle ne bloque rien : elle se contente de signaler ce qu'elle aurait bloqué. Vous pouvez donc poser la politique la plus stricte imaginable sur votre site en production, sans qu'un seul visiteur ne voie la différence, et lire pendant deux semaines la liste de ce qu'elle aurait cassé.
| Étape | Ce qu'on fait | Ce qu'on observe |
|---|---|---|
| 1. Observer | Poser l'en-tête Content-Security-Policy-Report-Only avec la politique visée. |
Rien ne change pour le visiteur. Les violations apparaissent dans la console du navigateur, et sont envoyées à l'adresse de collecte si vous en déclarez une. |
| 2. Dépouiller | Lire les signalements pendant une à deux semaines, le temps que toutes les pages soient visitées. | Vous découvrez ce que votre site charge vraiment : des services dont vous aviez oublié l'existence, des polices appelées depuis un tiers, un ancien outil de mesure jamais retiré. |
| 3. Ajuster | Autoriser ce qui est légitime, supprimer ce qui ne l'est plus. | C'est souvent ici que le vrai gain apparaît, et il n'a rien à voir avec la sécurité : un site allégé de trois traceurs oubliés charge plus vite. |
| 4. Appliquer | Renommer l'en-tête en Content-Security-Policy, sans changer la politique. |
La protection devient réelle. Gardez le mode observation en parallèle pour la suite : il vous préviendra quand un nouveau service sera ajouté au site. |
report-to associée à l'en-tête Reporting-Endpoints est la forme actuelle ; elle fonctionne sur les navigateurs à jour depuis mars 2026. L'ancien en-tête Report-To et la directive report-uri sont en voie de disparition, mais restent compris par du matériel plus ancien : les poser tous les deux pendant la transition ne coûte rien.Une politique de départ raisonnable pour un site vitrine, à passer d'abord en observation :
| Directive | Ce qu'elle dit |
|---|---|
default-src 'self' | Par défaut, tout vient de chez moi. |
object-src 'none' | Aucune extension embarquée, aucun greffon. Plus personne n'en utilise, et c'est une porte historique. |
base-uri 'self' | Interdit de réécrire l'adresse de base de la page, technique qui sert à détourner tous les liens relatifs d'un coup. |
frame-ancestors 'none' | Remplace avantageusement X-Frame-Options, avec lequel il fait doublon. |
form-action 'self' | Vos formulaires ne peuvent envoyer leurs données que chez vous. Souvent oublié, et redoutable contre un formulaire détourné. |
upgrade-insecure-requests | Les ressources encore appelées en http:// sont demandées en https:// au lieu d'être bloquées. |
8. Où les poser, concrètement Et le piège du double en-tête
Un en-tête peut être ajouté à plusieurs endroits de la chaîne, et c'est là que naissent la moitié des surprises.
Sur un hébergement mutualisé
Dans le fichier .htaccess à la racine du site, avec une directive Header always set par en-tête. C'est le cas le plus courant et le plus simple. Le fichier est lu à chaque requête : une faute de syntaxe rend le site entièrement indisponible, d'où l'intérêt de garder une copie avant de le modifier.
Sur un serveur que vous administrez
Dans la configuration du serveur web plutôt que dans un fichier du site : c'est plus rapide à servir, et cela survit à une réinstallation du site. Prévoir de recharger la configuration, et de vérifier qu'aucun bloc de configuration plus spécifique n'écrase le réglage général.
Depuis le code de l'application
Utile pour ce qui doit changer à chaque requête, typiquement le jeton à usage unique de la CSP. À réserver à ce cas : un en-tête statique posé par le code est payé à chaque exécution, alors que le serveur le pose gratuitement.
Chez le service qui sert de façade
Un réseau de distribution ou un service de protection placé devant votre site peut ajouter ou modifier les en-têtes au passage. Pratique, et source de confusion : ce que vous lisez depuis l'extérieur n'est plus ce que votre serveur a envoyé.
9. Vérifier ce que votre site envoie vraiment Trois façons, de la plus simple à la plus fiable
1 Dans votre navigateur
Ouvrez les outils de développement, onglet Réseau, rechargez la page, cliquez sur la première ligne : les en-têtes de réponse s'affichent en entier. Aucune installation, et c'est ce que voit réellement un visiteur.
Gratuit Débutant
2 En ligne de commande
curl -sI https://votre-site.fr affiche les en-têtes sans télécharger la page. Ajoutez -L pour suivre les redirections, et méfiez-vous du résultat : vous lirez alors les en-têtes de la dernière réponse, pas de la première, qui est justement celle qui vous intéresse pour HSTS.
Gratuit Intermédiaire
3 Par un service d'analyse
Plusieurs outils publics notent les en-têtes d'un site et expliquent chaque manque. Utile pour une vue d'ensemble, à condition de se rappeler qu'une bonne note ne dit rien de la qualité de votre CSP : une politique remplie d'autorisations larges est « présente » et sera comptée comme telle.
Gratuit
4 Après chaque mise en production
C'est le contrôle qui manque le plus souvent. Une migration, un changement d'hébergement, l'activation d'un service de façade : chacun de ces gestes peut effacer vos en-têtes sans le moindre message. Reprenez la vérification à chaque fois.
Le plus utile
10. Ce que ça coûte et ce que ça casse Dit avant, pas après
Aucune de ces protections n'est gratuite en temps, et deux d'entre elles peuvent faire des dégâts visibles. Autant le savoir avant de commencer.
| Ce que vous posez | Le temps réel | Ce que ça peut casser |
|---|---|---|
| Les trois en-têtes sans risque | Une demi-heure, vérification comprise | Rien, sauf si un partenaire intègre légitimement vos pages dans un cadre. |
| HSTS | Une heure, étalée sur quelques jours | Tout sous-domaine sans certificat valide devient inaccessible, et vous ne pouvez pas revenir en arrière chez les visiteurs déjà passés. |
| Permissions-Policy | Une heure, à condition de savoir ce que le site utilise | Une carte, un lecteur vidéo ou un module de paiement dont la permission n'a pas été prévue cesse de fonctionner, souvent en silence. |
| Une CSP sérieuse | Une à deux journées, plus deux semaines d'observation | Beaucoup, si elle est appliquée d'emblée : scripts de mesure, formulaires intégrés, polices distantes, éditeur de contenu. C'est toute la raison d'être du mode observation. |
'unsafe-inline' vous fera gagner des points dans un rapport d'audit et ne vous protégera de rien. Si vous n'avez pas les deux jours, posez les trois premiers et laissez la CSP pour plus tard : c'est un choix défendable, contrairement à une CSP décorative.11. Ce que vous pouvez faire seul, et quand appeler quelqu'un La limite honnête
- Seul, sans hésiter : retirer les trois en-têtes obsolètes, poser
nosniff,Referrer-PolicyetX-Frame-Options, vérifier le résultat. Si vous savez modifier un fichier sur votre hébergement, vous savez faire cela. - Seul, avec de la méthode : HSTS, en respectant la montée progressive de la durée et en recensant vos sous-domaines avant d'ajouter
includeSubDomains. - Seul si votre site est simple : une CSP sur un site vitrine sans outil tiers, en passant par le mode observation. Comptez une journée et n'appliquez rien avant d'avoir dépouillé les signalements.
- Faites-vous accompagner : dès qu'il y a une boutique, un module de paiement, un espace client, ou une douzaine de services tiers. Le nombre de combinaisons à valider dépasse alors ce qu'on peut tester à la main, et une erreur ne casse pas une page mais une transaction.
'unsafe-inline' dans la directive des scripts. S'il y est sans être accompagné d'un jeton à usage unique ou de 'strict-dynamic', vous payez pour une ligne de plus dans un rapport, pas pour une protection. La question est technique, mais elle se pose sans savoir coder, et la réponse vous apprendra beaucoup.Mémo publié par NET&PRO à titre pédagogique. Information générale, sans garantie d'exactitude, d'exhaustivité ni d'actualité, et sans valeur de conseil personnalisé. Avertissement et limites d'usage
Dans le glossaire
Les mots croisés au fil de ce mémo, définis en une phrase. Ils sont soulignés dans le texte : un clic y mène directement.
Mémos liés
La Cybersécurité de A à Z
De Zero Trust à l'IA offensive : menaces 2026, fondamentaux, attaques modernes, cas Mythos, IA défensive et offensive, outils.
Lire le mémoMettre un site en ligne de A à Z
Nom de domaine, hébergement, transfert du code, HTTPS, droits, sauvegardes : la mise en ligne expliquée pas à pas.
Lire le mémoLe Frontend & UI/UX de A à Z
HTML, CSS, JS, frameworks, npm, API, design systems, accessibilité et tendances 2026 : du newbie à l'expert.
Lire le mémoSur le blog
Le faire vous-même
Trois des six en-têtes se posent en une demi-heure et ne peuvent rien casser. C'est le meilleur rapport entre l'effort et le gain de tout ce mémo, et il ne demande que de savoir modifier un fichier sur votre hébergement.
- Le temps réel : une demi-heure pour les trois sans risque, une heure pour HSTS, et une à deux journées plus deux semaines d'observation pour une politique de sécurité du contenu digne de ce nom.
- Les outils gratuits : les outils de développement de votre navigateur pour lire vos en-têtes, et le mode observation de la politique, qui permet de tout essayer en production sans qu'un seul visiteur voie la différence.
- Le piège : poser une politique avec
'unsafe-inline'pour que le site refonctionne. Vous gagnez une ligne dans un rapport d'audit et vous ne vous protégez de rien, ce que font 92 % des sites qui en déploient une.
Si vous préférez me le confier
Sur ce sujet, voici ce que je fais pour mes clients. Les formules disent ce qui est compris, ce qui ne l'est pas, et ce que ça coûte au bout de trois ans.