Aller au contenu
NET&PRO...

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.

ℹ️
Ce mémo ne parle pas de pare-feu ni d'antivirus. Les en-têtes ne protègent pas votre serveur : ils protègent vos visiteurs contre ce qu'un attaquant pourrait leur faire faire depuis votre site. La distinction compte, parce qu'elle explique pourquoi votre hébergeur ne les pose pas à votre place : ce n'est pas son travail, c'est le vôtre.
📊

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êtePages qui le posentCe 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.
🔥
Le chiffre qui devrait vous intéresser le plus n'est pas dans le tableau. Parmi les sites qui ont pris la peine de poser une politique de sécurité du contenu, 92 % y laissent 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êteStatutQuoi 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.
💡
Pendant que vous y êtes, retirez aussi ce qui parle trop. Les en-têtes 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 includeSubDomains que 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.
⚠️
Le préchargement est presque irréversible. On peut inscrire son domaine sur une liste embarquée directement dans les navigateurs, de sorte que la protection s'applique dès la toute première visite. C'est la version la plus solide, et c'est un engagement : sortir de cette liste prend des mois, le temps que les nouvelles versions des navigateurs se déploient. Ne l'envisagez que si chaque sous-domaine, présent et futur, sera servi en HTTPS pour les années qui viennent. Pour un site d'entreprise ordinaire, l'en-tête sans préchargement suffit largement.
🎭

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.

🔥
Sauf que '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é.

ÉtapeCe qu'on faitCe 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.
💡
Un mot sur la collecte des signalements. La directive 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 :

DirectiveCe 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-requestsLes 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é.

⚠️
Le même en-tête posé deux fois n'est pas deux fois plus fort. Quand deux couches déclarent chacune une politique de sécurité du contenu, le navigateur applique l'intersection des deux : seul ce que les deux autorisent passe. Le symptôme est déroutant, un site qui casse alors que chacune des politiques prise isolément fonctionne. Avant d'ajouter un en-tête, vérifiez donc toujours ce qui est déjà envoyé, y compris par une couche que vous n'avez pas configurée vous-même.
🔎

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 posezLe temps réelCe 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.
🎓
Le rapport coût-bénéfice, sans enrobage. Les trois premiers en-têtes sont le meilleur investissement de sécurité que puisse faire un site vitrine : une demi-heure, aucun risque, et la disparition de plusieurs classes d'attaques opportunistes. La CSP, elle, demande un vrai travail et n'a de valeur que si elle est faite correctement : une CSP posée en dix minutes avec '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-Policy et X-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.
⭐
Un point de repère pour juger un prestataire. Demandez-lui de vous montrer la politique qu'il compte poser, et cherchez-y '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

Partager

Mémos liés

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.

NET&PRO

Un mémo, c'est la carte. Le trajet, on le fait avec vous.

Vous avez compris le sujet. NET&PRO s'occupe de la mise en œuvre : audit de l'existant, développement, automatisation, formation de vos équipes.