Sécurité

En-têtes de sécurité HTTP : HSTS, CSP et les réglages qui comptent

Mis à jour le

Quelques en-têtes de réponse suffisent à fermer des classes entières d'attaques : HSTS impose HTTPS, la Content-Security-Policy restreint les sources de scripts, nosniff bloque l'interprétation hasardeuse des types de fichiers et frame-ancestors empêche l'intégration du site dans une page tierce. Ils se configurent une fois, au niveau du serveur ou du framework.

Les en-têtes de base

Ces quatre réglages sont ceux par lesquels commencer : ils ne cassent rien sur un site déjà servi en HTTPS, à une réserve près — avec includeSubDomains, HSTS s'applique aussi aux sous-domaines, qui doivent tous répondre en HTTPS.

  • Strict-Transport-Security : le navigateur n'utilise plus que HTTPS pour le domaine pendant la durée indiquée par max-age.
  • X-Content-Type-Options: nosniff : le navigateur respecte le type déclaré et n'exécute pas comme script un fichier servi sous un autre type.
  • Content-Security-Policy avec frame-ancestors 'none' : le site ne peut plus être affiché dans un cadre tiers, ce qui bloque le détournement de clic. X-Frame-Options: DENY couvre les navigateurs plus anciens.
  • Referrer-Policy: strict-origin-when-cross-origin : seule l'origine, sans le chemin ni les paramètres, est transmise aux sites tiers.

La CSP : puissante, mais à déployer par étapes

La Content-Security-Policy liste les origines autorisées pour chaque type de ressource : scripts, styles, images, connexions, cadres. Un script injecté depuis une origine non listée n'est pas exécuté, ce qui limite fortement l'impact d'une faille XSS.

Une politique trop stricte casse le site sans prévenir. L'en-tête Content-Security-Policy-Report-Only applique la politique « à blanc » : le navigateur signale les violations sans rien bloquer, le temps d'ajuster la liste.

Le compromis des sites statiques

La CSP la plus stricte repose sur un nonce : une valeur aléatoire, différente à chaque réponse, que portent les scripts légitimes. Or un nonce propre à chaque requête est incompatible avec une page générée une fois pour toutes et servie depuis un cache.

Sur un site pré-rendu, deux options restent : des empreintes (hash) pour les scripts en ligne, quand le framework le permet, ou 'unsafe-inline' pour les scripts, compensé par une liste d'origines courte. C'est un compromis à assumer explicitement : on conserve le cache, au prix d'une protection moindre contre l'injection de scripts en ligne.

En bref

À quoi sert l'en-tête HSTS ?

Strict-Transport-Security indique au navigateur de n'utiliser que HTTPS pour le domaine pendant la durée fixée par max-age. Une fois l'en-tête reçu, toute tentative de connexion en HTTP est convertie en HTTPS par le navigateur, avant même de partir sur le réseau.

Qu'est-ce qu'une Content-Security-Policy ?

Un en-tête qui liste les origines autorisées à fournir scripts, styles, images et autres ressources. Le navigateur bloque ce qui n'y figure pas, ce qui réduit l'impact d'une injection de script.

Comment tester une CSP sans casser son site ?

Avec l'en-tête Content-Security-Policy-Report-Only : la politique est évaluée et les violations sont signalées dans la console du navigateur, mais rien n'est bloqué.

Poursuivre dans le Lab