Les 9 en-têtes de sécurité HTTP que votre boutique doit avoir

HSTS, CSP, X-Frame-Options... Ces en-têtes HTTP protègent vos clients contre le clickjacking, le cross-site scripting et les attaques man-in-the-middle. Voici lesquels sont critiques et comment les configurer.

Les 9 en-têtes de sécurité HTTP que votre boutique doit avoir

Ouvrez les DevTools de n'importe quel site e-commerce et regardez les en-têtes de réponse HTTP. Dans la majorité des cas, vous trouverez un Server: Apache/2.4.41 bien visible, et pas grand-chose d'autre côté sécurité.

Les en-têtes de sécurité HTTP disent au navigateur comment se comporter face aux attaques courantes : clickjacking, cross-site scripting (XSS), injection de contenu, downgrade HTTPS. D'après l'Observatory de Mozilla, une grande partie des sites obtiennent un score F.

Voici les 9 en-têtes qui comptent, par ordre de priorité.

Les 3 critiques

1. Strict-Transport-Security (HSTS)

HSTS force le navigateur à utiliser exclusivement HTTPS, même si l'utilisateur tape http://. Sans cet en-tête, la première requête peut transiter en clair, ce qui ouvre une fenêtre aux interceptions man-in-the-middle (Wi-Fi public, notamment).

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

Le max-age doit être d'au moins 31 536 000 secondes (1 an). PurpleScan signale une erreur en dessous. L'option includeSubDomains étend la protection à cdn.votresite.com, api.votresite.com, etc.

Erreur fréquente : un max-age=0 ou max-age=86400 (1 jour) laissé après une phase de test. Autant ne pas avoir HSTS du tout.

2. X-Frame-Options

Empêche votre site d'être embarqué dans une <iframe> sur un site tiers. Sans ça, un attaquant peut superposer votre page de paiement sous une interface trompeuse (clickjacking). L'utilisateur croit cliquer sur un bouton anodin, il valide en réalité un paiement.

X-Frame-Options: DENY

Ou SAMEORIGIN si vous avez besoin d'iframes internes (back-office, prévisualisation). N'utilisez pas ALLOW-FROM, c'est obsolète et ignoré par les navigateurs modernes (MDN).

3. Content-Security-Policy (CSP)

L'en-tête le plus puissant et le plus pénible à configurer. La CSP indique au navigateur quelles sources de contenu sont autorisées : scripts, styles, images, fonts, iframes, requêtes XHR.

Une CSP bien faite neutralise la plupart des attaques XSS. Même si un attaquant injecte un script, le navigateur refuse de l'exécuter si la source n'est pas dans la liste.

Exemple minimal pour un site e-commerce :

Content-Security-Policy: default-src 'self'; script-src 'self' https://js.stripe.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://cdn.votresite.com; font-src 'self' https://fonts.gstatic.com; frame-src https://js.stripe.com; connect-src 'self' https://api.votresite.com

Le problème en e-commerce, ce sont les scripts tiers. Google Analytics, Facebook Pixel, la CMP, le chat widget : chacun a besoin d'une entrée dans la CSP. C'est pour ça que beaucoup de sites n'en ont pas. Mais une CSP partielle vaut mieux que rien. Commencez en mode Content-Security-Policy-Report-Only pour voir les violations sans rien bloquer.

Les 3 importants

4. X-Content-Type-Options

Empêche le navigateur de "deviner" le type MIME d'une ressource. Sans lui, un fichier uploadé déguisé en image pourrait être interprété comme un script (MIME sniffing).

X-Content-Type-Options: nosniff

Une seule ligne. Aucune raison de ne pas l'avoir.

5. Referrer-Policy

Quand un visiteur clique sur un lien externe depuis votre site, le navigateur envoie par défaut l'URL complète de la page d'origine dans l'en-tête Referer. Sur un site e-commerce, ça peut contenir des identifiants de commande ou des tokens (MDN).

Referrer-Policy: strict-origin-when-cross-origin

Envoie uniquement le domaine vers les sites tiers, l'URL complète en interne. Bon compromis entre vie privée et analytics.

6. Permissions-Policy

Anciennement Feature-Policy. Contrôle quelles API du navigateur votre site peut utiliser : géolocalisation, caméra, microphone, notifications push.

Permissions-Policy: camera=(), microphone=(), geolocation=(self), payment=(self)

Désactivez tout ce dont vous n'avez pas besoin. Si un script tiers tente d'accéder à la caméra, le navigateur bloque.

Les 3 avancés

7. Cross-Origin-Opener-Policy (COOP)

Isole votre page des fenêtres qu'elle ouvre (ou qui l'ouvrent). Sans ça, une page ouverte via window.open peut interagir avec la fenêtre d'origine.

Cross-Origin-Opener-Policy: same-origin

8. Cross-Origin-Embedder-Policy (COEP)

Empêche votre page de charger des ressources cross-origin qui n'ont pas explicitement accordé la permission via CORS ou CORP. Combiné avec COOP, il active l'isolation cross-origin du navigateur.

Cross-Origin-Embedder-Policy: require-corp

Attention : peut casser le chargement d'images et scripts tiers qui ne renvoient pas les bons en-têtes CORS. Testez avant de déployer.

9. Cross-Origin-Resource-Policy (CORP)

Indique qui peut charger vos ressources. Si vos images produit sont sur un CDN, vous voulez que votre site puisse y accéder, mais pas qu'un concurrent les intègre.

Cross-Origin-Resource-Policy: same-site

Server fingerprinting

PurpleScan détecte aussi un problème courant : l'exposition de la version du serveur.

Server: Apache/2.4.41 (Ubuntu)
X-Powered-By: PHP/8.1.2

Ces en-têtes ne servent à rien pour le visiteur. Par contre, ils donnent à un attaquant la version exacte de votre serveur web et de PHP, avec les vulnérabilités connues qui vont avec. CVE Details répertorie des centaines de failles par version d'Apache et de PHP.

Correction :

Apache (httpd.conf ou apache2.conf) :

ServerTokens Prod
ServerSignature Off

Nginx (nginx.conf) :

server_tokens off;

PHP (php.ini) :

expose_php = Off

Par plateforme e-commerce

Shopify

Contrôle limité. Shopify gère l'infrastructure et définit ses propres en-têtes. HSTS est activé par défaut (Shopify force HTTPS). En revanche, impossible d'ajouter une CSP personnalisée ou de modifier les autres en-têtes. Vous pouvez ajouter des meta-tags équivalentes dans votre thème, mais leur efficacité est moindre.

Magento / Adobe Commerce

Contrôle total. Vous gérez votre serveur, tout est configurable via Apache ou Nginx. Magento 2 ne définit aucun en-tête de sécurité par défaut. Plus de travail, mais plus de flexibilité.

PrestaShop

Comme Magento, auto-hébergé avec accès complet à la configuration serveur. Attention : PrestaShop envoie un X-Powered-By: PrestaShop par défaut. Désactivez-le dans la config PHP ou ajoutez Header unset X-Powered-By dans votre .htaccess.

Ce que PurpleScan vérifie

Pour chaque page crawlée, PurpleScan analyse les en-têtes HTTP et attribue un niveau de sévérité :

  • ERROR : HSTS absent ou max-age insuffisant, CSP absente
  • WARNING : X-Frame-Options absent, X-Content-Type-Options absent, Referrer-Policy absente, Permissions-Policy absente, server fingerprinting
  • INFO : COOP, COEP, CORP absents (bonnes pratiques avancées)

Commencez par les 3 critiques. Ils couvrent les risques les plus sérieux et se configurent en quelques minutes. Le reste, vous l'ajouterez au fur et à mesure.