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.