Note des en-têtes de sécurité

Six courtes lignes dans une réponse de serveur disent au navigateur à quel point il doit se montrer prudent avec votre page. Cette vérification les lit, les note sur 100 et écrit à votre place celles qui manquent.

Ou essayez github.com, wikipedia.org

Les en-têtes sont des consignes, pas du contenu

Chaque fois qu’un navigateur demande une page, le serveur répond en deux parties. La seconde est la page elle-même. La première est une liste d’en-têtes, de courtes lignes nom-valeur que le visiteur ne voit jamais, comme le type de fichier, la durée de mise en cache et les cookies à conserver.

Une poignée de ces lignes sont des consignes de sécurité. Elles ne rendent pas votre serveur plus difficile à pirater. Elles activent des protections que tout navigateur moderne possède déjà et qui restent désactivées tant qu’un site ne les demande pas. Un site qui n’en envoie aucune fonctionne très bien. Il laisse simplement une armure gratuite dans sa boîte.

Les six en-têtes notés par cette vérification

En-têtePointsCe qu’il empêche
Strict-Transport-Security25Un visiteur ramené discrètement vers http:// non chiffré sur un Wi-Fi hostile. Après la première visite, le navigateur refuse le HTTP simple pour votre domaine pendant toute la durée indiquée par max-age.
Content-Security-Policy25Les scripts injectés. Vous publiez la liste des endroits d’où le code peut être chargé et tout le reste est bloqué, même si un attaquant réussit à glisser une balise <script> dans un commentaire ou un champ de formulaire.
X-Frame-Options15Le clickjacking, où un autre site charge le vôtre dans un cadre invisible et pousse les gens à appuyer sur vos boutons. L’équivalent moderne est frame-ancestors dans la CSP, que cette vérification accepte aussi.
X-Content-Type-Options15La devinette de type. Avec nosniff, un fichier téléversé comme image ne peut pas être exécuté comme un script parce que le navigateur « a trouvé que ça y ressemblait ».
Referrer-Policy10La fuite des adresses complètes de pages, y compris tout ce qui est privé dans l’URL, vers chaque site que vous liez.
Permissions-Policy10Un contenu tiers intégré qui demande la caméra, le micro ou la position en votre nom.

Les pondérations suivent l’ampleur des dégâts que chacun évite. Les deux en-têtes à 25 points arrêtent les attaques qui vident vraiment des comptes. Ceux à 10 points relèvent de la vie privée et de la bonne tenue.

Comment lire la note

Un en-tête ne compte en entier que si sa valeur fait le travail. Trois situations donnent un crédit partiel :

  • HSTS de moins de six mois. Un max-age d’un jour convient pendant les essais, mais il ne protège les visiteurs qui reviennent que pendant un jour.
  • Une CSP qui autorise 'unsafe-inline' ou 'unsafe-eval' sans nonces ni empreintes. C’est justement la porte que la politique devait fermer.
  • Une CSP en mode Report-Only. Elle observe et signale mais ne bloque encore rien. C’est la bonne première étape, à condition de ne pas s’arrêter là.

La vérification liste aussi chaque cookie posé par la page et indique s’il porte Secure, HttpOnly et SameSite. Ces attributs ne comptent pas dans la note, mais un cookie de session qui en est dépourvu défait une bonne part de ce que les en-têtes apportent.

Un A ici signifie que les protections côté navigateur sont activées pour cette seule réponse. Cela ne dit rien des mots de passe, des extensions ou des correctifs du serveur. Différentes pages d’un même site peuvent aussi envoyer des en-têtes différents, alors testez les pages qui comptent : connexion, paiement, compte.

Où les ajouter

Les en-têtes se définissent là où les réponses sont produites et la couche la plus proche du visiteur l’emporte :

Un CDN ou un proxy (Cloudflare, Fastly, la périphérie d’un hébergeur)
En général une règle « en-tête de réponse » ou « transformation » dans le tableau de bord. Une seule règle couvre tout le site, pages en cache comprises.
Apache
Dans .htaccess ou l’hôte virtuel : Header always set X-Content-Type-Options "nosniff". Le mot always l’applique aussi aux pages d’erreur.
nginx
add_header X-Content-Type-Options "nosniff" always; dans le bloc server. Attention à un point : un add_header dans un bloc location remplace ceux du dessus, il ne s’y ajoute pas.
L’application
Les frameworks et les extensions de CMS peuvent envoyer des en-têtes, mais seulement sur les pages qu’ils génèrent. Les fichiers statiques servis directement par le serveur web les manqueront.

Commencez par les quatre qui ne peuvent rien casser : nosniff, X-Frame-Options: SAMEORIGIN, une Referrer-Policy et une Permissions-Policy. Ajoutez HSTS quand tous les sous-domaines fonctionnent en HTTPS. Gardez la Content-Security-Policy pour la fin et déployez-la d’abord en mode report-only, car une mauvaise CSP bloquera vos propres scripts.

Questions fréquentes

Ajouter des en-têtes de sécurité va-t-il casser mon site ?

Quatre des six peuvent être ajoutés sans y regarder. Les deux qui demandent du soin sont HSTS et Content-Security-Policy. HSTS enferme les visiteurs en HTTPS pour la durée que vous fixez, donc chaque sous-domaine doit déjà avoir un certificat valide si vous utilisez includeSubDomains. Une CSP bloque tout ce qui n’est pas sur votre liste. Testez-la avec Content-Security-Policy-Report-Only pendant une semaine ou deux avant de l’appliquer.

Les en-têtes de sécurité aident-ils le référencement ?

Pas directement. Les moteurs de recherche ne classent pas les pages selon leurs en-têtes. HTTPS est un signal de classement léger et HSTS fait tenir HTTPS. Ce que vous gagnez vraiment, c’est moins de pages piratées et un site piraté perd vite son classement.

Pourquoi X-XSS-Protection n’est-il pas dans la liste ?

Les navigateurs ont retiré le filtre qu’il contrôlait. Chrome l’a abandonné en 2019 et Firefox ne l’a jamais eu. Le conseil actuel est de l’omettre ou de le mettre à 0 et de s’appuyer plutôt sur une Content-Security-Policy.

Quel max-age HSTS faut-il utiliser ?

Un an (max-age=31536000) est la cible habituelle et le minimum pour les listes de préchargement des navigateurs. Commencez par quelques minutes, vérifiez que rien ne casse, puis augmentez par paliers. Cette vérification donne la note maximale à partir de six mois.

Mon site est derrière Cloudflare. À qui sont ces en-têtes ?

À ceux que le visiteur reçoit et ce sont ceux qui comptent. Si votre serveur d’origine définit un en-tête et que le CDN le supprime ou le remplace, la note reflète la version du CDN.