CentralCSP
Headers de sécurité

Informations divulguées

Server, X-Powered-By et les autres headers qui révèlent votre stack et vos versions aux attaquants, la liste complète et comment les supprimer.

Dernière mise à jour:

Certains headers de réponse n'existent que pour annoncer les logiciels que vous exécutez. Server nomme le serveur web, souvent avec sa version exacte et son système d'exploitation. X-Powered-By nomme le langage ou le framework du backend. Derrière ces deux-là s'étend une longue traîne de headers propres aux éditeurs qui nomment le CMS, le cache, l'agent de supervision ou une machine interne. Aucun d'eux ne change la façon dont le navigateur affiche la page.

Ce qu'ils font, c'est offrir à un attaquant une empreinte gratuite de votre stack, prête à être recherchée dans les bases de CVE pour y trouver des exploits connus. Le correctif coûte une ligne de configuration par header : le supprimer, ou, là où le serveur refuse de le retirer, le réduire à une valeur générique sans version.

À quoi ressemble une réponse bavarde
HTTP/1.1 200 OK
Server: Apache/2.4.41 (Unix)
X-Powered-By: PHP/8.2.1
Content-Type: text/html; charset=utf-8
Après nettoyage
HTTP/1.1 200 OK
Server: Apache
Content-Type: text/html; charset=utf-8

Pourquoi les bannières comptent

Prendre l'empreinte du serveur web est une première étape formelle d'un test d'intrusion. Le guide de test de l'OWASP (WSTG-INFO-02, Fingerprint Web Server) appelle la technique le banner grabbing : envoyer une requête, lire les headers de réponse. Un header comme Server: Apache/2.4.41 (Unix) répond à l'essentiel de la reconnaissance en une ligne, et, comme le dit le guide, les serveurs qui font tourner d'anciennes versions de logiciels sans correctifs de sécurité à jour peuvent être vulnérables à des exploits connus propres à ces versions.

Le processus est mécanique. Une bannière de version exacte, disons X-Powered-By: PHP/5.3.7, part directement dans une recherche de base de CVE, qui renvoie la liste des vulnérabilités connues de cette version. Certains headers de divulgation en révèlent plus qu'une version. Les réponses de Microsoft Exchange peuvent transporter les noms de serveurs front-end et back-end internes (X-FEServer, X-BEServer, X-CalculatedBETarget), cartographiant la même surface de routage front-end vers back-end dont la chaîne d'exploitation ProxyLogon (CVE-2021-26855, analysée par Google Project Zero) a abusé.

Soyez toutefois honnête sur le poids de ce constat. MDN qualifie le masquage du header Server de mesure au bénéfice discutable, parce que les attaquants peuvent prendre l'empreinte d'une stack par d'autres moyens, et indique que l'approche la plus fiable consiste à garder le logiciel à jour et corrigé. Les bonnes pratiques de sécurité d'Express disent la même chose de la désactivation de X-Powered-By : elle n'empêche pas un attaquant chevronné d'identifier le framework. Retirer les bannières coupe le vecteur de reconnaissance le moins coûteux et fait disparaître les constats que remontent chaque scanner et chaque rapport de test d'intrusion ; la défense qui compte vraiment, c'est l'application des correctifs.

Les headers à supprimer

Chaque header des tableaux ci-dessous reçoit le même conseil, le supprimer, il n'y a donc pas de colonne de statut. L'inventaire de référence est la liste de suppression de l'OWASP Secure Headers Project, 81 headers dans sa mise à jour du 30 juin 2026, sur laquelle s'appuient les scanners et les rapports de test d'intrusion. Les tableaux regroupent les entrées les plus courantes par ce qu'elles révèlent ; lorsqu'un header est signalé par la communauté plutôt que documenté officiellement, la description le précise.

Bannières de serveur, de langage et de framework

HeaderCe qu'il révèle
ServerLe logiciel serveur, généralement sa version, parfois l'OS (Apache/2.4.41 (Unix))
X-Powered-ByLa technologie du backend, souvent avec une version. PHP l'envoie quand expose_php est activé ; Express et Next.js l'envoient par défaut
X-AspNet-VersionLa version exacte d'ASP.NET
X-AspNetMvc-VersionLa version d'ASP.NET MVC
X-Php-VersionSignalé comme une bannière de version PHP ; sur la liste de suppression de l'OWASP
X-Framework, X-Server-Powered-By, X-Content-Encoded-ByD'autres bannières de stack sur la liste de suppression de l'OWASP, largement signalées sur les sites Joomla

Versions de CMS et de plateforme

HeaderCe qu'il révèle
X-GeneratorLe CMS derrière la page ; Drupal émet Drupal N
X-OWA-VersionLe numéro de build exact d'Outlook Web Access d'Exchange
X-Umbraco-Version, X-Joomla-Version, X-Powered-CMS, X-CF-Powered-BySignalés comme des bannières de version de CMS ; sur la liste de suppression de l'OWASP
X-Cocoon-VersionSignalé comme une bannière de version d'Apache Cocoon
Liferay-PortalSignalé comme révélant l'édition et la version de Liferay
OracleCommerceCloud-VersionUne bannière Oracle Commerce Cloud sur la liste de suppression de l'OWASP
Pega-HostSignalé comme révélant le nom d'un nœud Pega interne

Empreintes d'infrastructure et de cache

HeaderCe qu'il révèle
X-VarnishLes identifiants de transaction Varnish, un en cas de cache miss et deux en cas de hit, révélant la couche de cache
X-Turbo-Charged-ByUn serveur de la famille LiteSpeed
X-Backside-TransportUne passerelle IBM DataPower et l'état de sa connexion au backend
K-Proxy-RequestUn marqueur d'activateur Knative, révélant une plateforme serverless Kubernetes
Host-HeaderSignalé comme exposant des informations de routage d'un hébergement managé
ProductSur la liste de suppression de l'OWASP

Noms d'hôtes internes

Les serveurs front-end d'Exchange ajoutent des headers de routage aux réponses d'Outlook Web Access et d'autodiscover. Ils révèlent des noms de machines internes, ce qui relève de la divulgation de topologie plutôt que d'une bannière de version, et ils se trouvent sur la même surface de routage front-end vers back-end dont ProxyLogon a abusé.

HeaderCe qu'il révèle
X-FEServerLe nom du serveur front-end Client Access
X-BEServerLe nom du serveur back-end
X-CalculatedBETargetLe nom interne du serveur de boîtes aux lettres cible
X-DiagInfoLe nom du serveur de boîtes aux lettres qui répond

Agents de supervision

La famille OneAgent de Dynatrace marque les réponses qu'elle a touchées, indiquant à un attaquant exactement quelle stack de supervision surveille le site.

HeaderCe qu'il révèle
X-OneAgent-JS-InjectionLe OneAgent de Dynatrace injecte ici son JavaScript de supervision
X-ruxit-JS-AgentL'ancien nom du même marqueur d'injection
X-DTAgentIdL'identifiant de l'agent Dynatrace, vu sur les réponses de health-check
X-DTHealthCheckUn marqueur de health-check Dynatrace

Artefacts de développement et de débogage

Ceux-ci vont au-delà de la prise d'empreinte : chacun signifie qu'un élément du développement a atteint la production.

HeaderCe qu'il révèle
SourceMap / X-SourcemapL'URL d'une source map ; si le fichier .map est public, n'importe qui peut reconstituer votre code client original non minifié
X-SourceFilesUn header de débogage ASP.NET / IIS Express transportant, encodé en base64, le chemin local sur disque du fichier source. Il est réservé à localhost, donc le voir en production signifie qu'une configuration de débogage a fuité
X-NextJS-Matched-PathLe motif de route interne de Next.js qui a correspondu, comme /news/[slug]
X-NextJS-PageUn header interne de Next.js apparenté, sur la liste de suppression de l'OWASP
X-GitLab-MetaUn blob JSON avec un identifiant de corrélation et une version, observé sur les réponses de GitLab Pages

Comment les supprimer

Chaque stack dispose d'un interrupteur pour ses propres bannières. Tout ce que votre application ou votre framework ajoute par-dessus peut être retiré par ce qui se trouve devant, un reverse proxy ou un CDN.

nginx

nginx.conf
server_tokens off;
proxy_hide_header X-Powered-By;

Dans nginx, server_tokens off masque la version à la fois dans le header Server et dans les pages d'erreur intégrées, mais le header affiche toujours Server: nginx. Le retirer entièrement nécessite le module tiers headers-more (more_clear_headers Server;). En mode proxy, nginx remplace déjà le header Server de l'amont par le sien ; proxy_hide_header retire au passage les headers applicatifs tels que X-Powered-By.

Apache

httpd.conf
ServerTokens Prod
ServerSignature Off
Header always unset X-Powered-By

Dans Apache, ServerTokens Prod réduit la bannière à Server: Apache et ServerSignature Off retire le pied de page de version des pages d'erreur. Notez que Header unset Server ne retire pas le header Server propre à Apache (Apache Bug 40026) ; mod_headers ne peut retirer que les headers ajoutés par l'application, comme X-Powered-By.

IIS et ASP.NET

web.config
<configuration>
  <system.web>
    <httpRuntime enableVersionHeader="false" />
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering removeServerHeader="true" />
    </security>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

Sur IIS 10 et versions ultérieures, removeServerHeader retire complètement le header Server (Windows Server version 1709 et ultérieures). enableVersionHeader="false" supprime X-AspNet-Version, et le bloc customHeaders retire X-Powered-By. La bannière de version MVC a son propre interrupteur, défini au démarrage de l'application :

Global.asax.cs
MvcHandler.DisableMvcResponseHeader = true;

Express

app.js
app.disable('x-powered-by');

Les bonnes pratiques de sécurité d'Express recommandent cette ligne, ou d'utiliser Helmet, qui retire le header en même temps que ses autres modifications de headers.

PHP

php.ini
expose_php = Off

expose_php ne peut être défini que dans php.ini, pas à l'exécution.

Next.js

next.config.js
module.exports = {
  poweredByHeader: false,
};

L'option poweredByHeader empêche Next.js d'envoyer X-Powered-By.

En périphérie, au CDN ou au proxy

La périphérie peut retirer ce que l'origine ne peut pas. Sur Cloudflare, une règle de transformation de headers de réponse avec l'opération de suppression efface n'importe lequel de ces headers avant que la réponse n'atteigne le visiteur, avec une réserve : elle ne peut pas retirer les headers préfixés cf- ou x-cf-, ni le header server propre à Cloudflare. Un reverse proxy ou un cache que vous exploitez vous-même, comme Varnish, peut de la même façon retirer des headers de réponse dans sa logique de livraison. C'est souvent le correctif le plus rapide pour les headers d'éditeurs pour lesquels une plateforme managée ne vous offre aucun interrupteur.

Peut-on retirer entièrement le header Server

Cela dépend du serveur. IIS 10 et versions ultérieures le peuvent, avec removeServerHeader. Un nginx standard ne le peut pas : server_tokens off envoie encore Server: nginx, et le retrait complet nécessite le module headers-more. Apache ne le peut pas non plus ; ServerTokens Prod et son plancher Server: Apache sont tout ce que permet la configuration de base. Derrière un CDN, la question disparaît souvent, parce que la périphérie substitue sa propre bannière (Cloudflare envoie server: cloudflare, que vous ne pouvez pas retirer). Un simple nom de produit sans version est un état final tout à fait acceptable ; c'est la version qui alimente la recherche de CVE.

Recommandation

Supprimez ou banalisez chaque header des tableaux ci-dessus. Le cheat sheet OWASP sur les headers HTTP le dit sans détour : pour Server, « supprimez ce header ou définissez des valeurs non informatives », et « supprimez tous les headers X-Powered-By ». Utilisez la liste de suppression de l'OWASP Secure Headers Project comme check-list quand vous passez vos réponses en revue.

Gardez ce constat en perspective. Supprimer une bannière ne corrige rien ; si le logiciel derrière est obsolète, il est exactement aussi exploitable après. Faites ce nettoyage comme une mesure d'hygiène en parallèle des correctifs, pas à leur place. Pour voir lesquels de ces headers votre site envoie aujourd'hui, passez-le dans le scanner de headers de sécurité.

FAQ

Comment supprimer X-Powered-By ?

Cela dépend de ce qui l'émet. En PHP, réglez expose_php = Off ; dans Express, appelez app.disable('x-powered-by') ; dans Next.js, réglez poweredByHeader: false ; dans IIS, retirez-le via customHeaders. Quand vous ne pouvez pas modifier l'origine, retirez-le au reverse proxy ou au CDN, par exemple proxy_hide_header X-Powered-By dans nginx.

Le header Server est-il une vulnérabilité ?

Pas en lui-même. C'est un constat de divulgation d'information : la bannière de version indique à un attaquant quel logiciel et quelle version chercher dans une base de CVE, ce qui supprime l'étape de reconnaissance la moins coûteuse. Le vrai risque, c'est de faire tourner un logiciel non corrigé derrière la bannière. Le retirer fait taire les scanners mais ne corrige rien.

Masquer les bannières de version rend-il mon site sûr ?

Non. Retirer Server, X-Powered-By et les autres bannières est une réduction du bruit : cela supprime le vecteur de prise d'empreinte le plus facile et fait disparaître des constats de scanner. Cela ne corrige pas une seule faille sous-jacente. Comme le notent OWASP et MDN, garder le logiciel corrigé est la vraie défense ; le retrait des bannières est une mesure d'hygiène à côté.

Voir aussi

Sources

On this page