48 votes

Masquage de l'en-tête X-Powered-By de PHP

Je sais qu'en PHP, il envoie le X-Powered-By pour avoir la version de PHP.

Je sais aussi qu'en ajoutant des sommes de contrôle, vous pouvez accéder aux crédits de PHP et à des images aléatoires ( plus d'infos ici ).

Je sais également que dans le php.ini, vous pouvez activer la fonction expose_php = off .

Mais voici quelque chose que j'ai fait sur quelques sites, et qui est d'utiliser

header('X-Powered-By: Alex');

Lorsque je consulte les en-têtes, je constate que c'est maintenant "Alex" qui remplace la version PHP. Ma question est la suivante : est-ce que cela enverra d'abord l'ancien en-tête PHP (avant qu'il n'atteigne ma page d'accueil) ? header() et est-il détectable par un programme renifleur ? Ou les en-têtes sont-ils "collectés" par PHP ? avant renvoyée au navigateur ?

Au fait, ce n'est pas une question de sécurité par l'obscurité, je suis juste curieux de savoir comment les en-têtes fonctionnent en PHP.

4 votes

Pourquoi personne n'a suggéré header_remove ?

36voto

Kemo Points 6013

Vous pouvez définir expose_php = Off dans votre php.ini si vous ne voulez pas qu'il envoie l'en-tête X-Powered-By.

PHP compile d'abord tout (y compris quels en-têtes ont quelles valeurs) et ensuite lance la sortie, et non l'inverse.

PHP est également détectable avec ses propres easter eggs, vous pouvez lire à ce sujet ici : Oeufs de Pâques PHP

29voto

cletus Points 276888

Ver Conseils et astuces d'Apache : Cacher la version de PHP (X-Powered-By)

Ups Comme on peut le voir, PHP ajoute sa propre bannière :

X-Powered-By: PHP/5.1.2-1+b1…

Voyons comment on peut le désactiver. Sur Afin d'empêcher PHP de révéler le fait le fait qu'il est installé sur le en ajoutant sa signature à l'en-tête du serveur web que nous devons localiser dans php.ini la variable expose_php et le transformer off .

Par défaut expose_php est réglé sur On.

Dans votre php.ini (en fonction de votre distribution linux vous pouvez le trouver dans divers endroits, comme /etc/php.ini, /etc/php5/apache2/php.ini, etc.) localisez la ligne contenant expose_php On et le mettre sur Off :

expose_php = Off

Après avoir effectué ce changement, PHP n'ajoutera n'ajoutera plus sa signature à l'en-tête du serveur web. En faisant cela, vous no Il ne rendra pas votre serveur plus sûr il empêchera simplement les hôtes distants de de voir facilement que vous avez installé PHP sur votre système et quelle version vous utilisez vous utilisez.

3 votes

Mais cela ne conseille que de définir 'expose_php = Off' dans le php.ini, ce qu'Alex a déjà mentionné dans son message.

18voto

Powerlord Points 43989

En PHP, les en-têtes ne sont pas envoyés avant que PHP ne rencontre sa première déclaration de sortie.

Cela inclut tout ce qui se trouve avant le premier <?php .

C'est également la raison pour laquelle setcookie envoie un avertissement si vous essayez de l'utiliser après que quelque chose a été sorti :

Avertissement : Impossible de modifier l'en-tête les en-têtes ont déjà été envoyés par (la sortie a commencé à /path/to/php/file.php:100) in /path/to/php/file.php sur la ligne 150

Notez que rien de tout cela ne s'applique si mise en mémoire tampon des sorties est en cours d'utilisation, car la sortie ne sera pas envoyée tant que la commande appropriée de mise en tampon de la sortie n'aura pas été exécutée.

3voto

Andy Shellam Points 8120

Les en-têtes sont "collectés" par PHP avant d'être renvoyés au navigateur, ce qui vous permet d'ignorer des éléments comme l'en-tête d'état. La façon de le tester est d'aller à une invite de commande, et de taper :

telnet www.yoursite.com 80
GET /index.php HTTP/1.1
[ENTER]
[ENTER]

Et vous verrez les en-têtes qui sont envoyés dans la réponse (remplacez /index.php par l'URL de votre page PHP après le domaine).

1 votes

Une manière plus simple de voir les en-têtes de réponse HTTP est d'utiliser curl -I http://hostname/path .

1 votes

Pourquoi utiliser une requête GET au lieu d'une requête HEAD ?

0 votes

@kylek, Dans le cas des Heisenbugs. Idéalement, vous voulez tester les deux.

1voto

hakre Points 102271

Ma question est la suivante : est-ce que cela enverra d'abord l'en-tête PHP précédent (avant qu'il n'atteigne mon ordinateur) ? header() et est-il détectable par un programme renifleur ? Ou bien les en-têtes sont-ils "collectés" par PHP, avant d'être renvoyés au navigateur ?

Non, il n'envoie pas l'en-tête PHP précédent en premier. Les en-têtes sont soit envoyés, soit non envoyés (en entier, en un seul lot) en PHP. Par défaut, votre header Docs remplace un en-tête précédent avec le même nom (sauf si vous spécifiez quelque chose de différent avec le deuxième paramètre).

Note : Si PHP ne collectait pas les en-têtes, il ne serait pas en mesure d'en remplacer un.

Comme il ne l'a pas envoyé plus tôt, il n'est pas détectable avec un programme renifleur.

Donc oui, les en-têtes sont collectés par PHP et sont envoyés au moment où la "vraie" sortie commence (corps de la réponse HTTP).

Voir aussi headers_sent Docs .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X