web-dev-qa-db-fra.com

Masquer l'en-tête PHP X-Powered-By

Je sais qu'en PHP, il envoie l'en-tête X-Powered-By Pour avoir la version PHP.

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

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

Mais voici quelque chose que j'ai fait sur quelques sites, et c'est l'utilisation

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

Quand je regarde les en-têtes, je peux voir que c'est maintenant 'Alex' au lieu de la version PHP. Ma question est, est-ce que cela enverra la précédente PHP l'en-tête en premier (avant qu'il n'atteigne ma header(), et est-il détectable par n'importe quel programme de renifleur? Ou les en-têtes sont-ils 'collectés' par PHP, avant être renvoyé au navigateur?

Soit dit en passant, ce n'est pas pour la sécurité par obscurité, juste curieux de savoir comment les en-têtes fonctionnent en PHP.

42
alex

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

Cela inclut tout avant le premier <?php.

C'est aussi pourquoi setcookie envoie un avertissement si vous essayez de l'utiliser après la sortie de quelque chose:

Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par (sortie démarrée à /path/to/php/file.php:100) dans /path/to/php/file.php sur la ligne 150

Notez que rien de tout cela ne s'applique si tampon de sortie est utilisé, car la sortie ne sera envoyée qu'après l'exécution de la commande de tampon de sortie appropriée.

16
Powerlord

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), puis démarre la sortie, et non l'inverse.

PHP est également détectable avec ses propres œufs de Pâques, vous pouvez lire à ce sujet ici: PHP Easter Eggs

33
Kemo

Voir Trucs et astuces Apache: Masquer PHP (X-Powered-By)

Ups… Comme nous pouvons le voir PHP ajoute sa propre bannière:

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

Voyons comment nous pouvons le désactiver. Afin d'empêcher PHP d'exposer le fait qu'il est installé sur le serveur, en ajoutant sa signature à l'en-tête du serveur Web, nous devons localiser dans php .ini la variable expose_php et tournez-le off.

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

Dans votre php.ini (basé sur votre distribution Linux, cela peut être trouvé à divers endroits, comme /etc/php.ini, /etc/php5/Apache2/php.ini, etc.) localisez la ligne contenant expose_php On et désactivez-le:

expose_php = Off

Après avoir effectué cette modification PHP n'ajoutera plus sa signature à l'en-tête du serveur Web. Ce faisant, ne fera pas faire votre serveur plus sécurisé… cela empêchera simplement les hôtes distants de voir facilement que vous avez PHP installé sur le système et quelle version vous utilisez.

27
cletus

Les en-têtes sont "collectés" par PHP avant d'être renvoyés au navigateur, afin que vous puissiez remplacer 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.)

3
Andy Shellam

Pour se débarrasser de l'en-tête X-Powered-By sans avoir accès à php.ini, ajoutez simplement un en-tête vide.

<?php header('X-Powered-By:'); ?>

Cela écrase l'en-tête X-Powered-By par défaut avec une valeur vide et bien que la plupart des clients et des applications agissent comme si cet en-tête n'était pas envoyé du tout.

Comme indiqué précédemment, cela doit être inséré dans le code avant d'envoyer une sortie.

Et pour répondre à votre question:

Seul votre en-tête X-Powered-By sera envoyé car il sera remplacé par votre en-tête du même nom. Il ne peut donc pas être détecté par un "renifleur".

2
Ludwig

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

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

Remarque: Si PHP ne collecterait pas les en-têtes, il ne pourrait pas 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 sortie "réelle" démarre (corps de réponse HTTP).

Voir aussi headers_sent Docs .

1
hakre