Скрытие PHP-заголовка X-Powered-By - PullRequest
42 голосов
/ 23 февраля 2010

Я знаю, что в PHP он отправляет заголовок X-Powered-By для получения версии PHP.

Я также знаю, добавив некоторые контрольные суммы, вы можете получить доступ к кредитам PHP и некоторым случайным изображениям ( подробнее здесь ).

Я также знаю, что в php.ini вы можете включить expose_php = off.

Но вот кое-что, что я сделал на нескольких сайтах, это использование

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

Когда я просматриваю заголовки, я вижу, что теперь это «Алекс», а не версия PHP. Мой вопрос заключается в том, будет ли при этом отправляться предыдущий заголовок PHP (до того, как он достигнет моего header(), и будет ли он обнаружен какой-либо программой-сниффером? браузер?

Кстати, это не для безопасности от неясности, просто любопытно, как работают заголовки в PHP.

Ответы [ 6 ]

32 голосов
/ 23 февраля 2010

Вы можете установить expose_php = Off в своем php.ini, если не хотите, чтобы он отправлял заголовок X-Powered-By.

PHP сначала компилирует все (включая заголовки, какие значения), а затем начинает вывод, а не наоборот.

PHP также можно обнаружить с помощью собственных пасхальных яиц, об этом можно прочитать здесь: Пасхальные яйца PHP

27 голосов
/ 23 февраля 2010

См. Советы и рекомендации Apache: Скрыть версию PHP (X-Powered-By)

Ups ... Как мы видим, PHP добавляет свои собственные баннер:

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

Давайте посмотрим, как мы можем отключить его. В для того, чтобы предотвратить разоблачение PHP тот факт, что он установлен на сервер, добавив свою подпись в заголовок веб-сервера, который мы должны найти в php.ini переменная expose_php и поворот ее off.

По умолчанию expose_php установлено на Вкл.

В вашем php.ini (на основе вашего Linux Распределение это можно найти в различные места, такие как /etc/php.ini, /etc/php5/apache2/php.ini и т. д.) найдите строку, содержащую expose_php On, и установите для нее значение Выкл .:

expose_php = Off

После внесения этого изменения PHP не будет подольше добавь свою подпись в сеть заголовок сервера. Делая это, будет не сделает ваш сервер более безопасным ... он просто не даст удаленным хостам легко увидеть, что у вас установлен PHP в системе и какая у вас версия работает.

16 голосов
/ 23 февраля 2010

В PHP заголовки не отправляются, пока PHP не встретит свой первый оператор вывода.

Это включает в себя все, что до первого <?php.

Именно поэтому setcookie отправляет предупреждение, если вы пытаетесь использовать его после вывода чего-либо:

Предупреждение: невозможно изменить заголовок информация - заголовки уже отправлены (вывод начался в /path/to/php/file.php:100) в /path/to/php/file.php в строке 150

Обратите внимание, что ничего из этого не применимо, если используется буферизация вывода , так как вывод не будет отправлен, пока не будет выполнена соответствующая команда буферизации вывода.

3 голосов
/ 23 февраля 2010

Заголовки «собираются» PHP перед отправкой обратно в браузер, так что вы можете переопределять такие вещи, как заголовок статуса. Чтобы проверить это, перейдите в командную строку и введите:

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

И вы увидите заголовки, отправленные в ответе (замените /index.php URL-адресом вашей страницы PHP после домена.)

2 голосов
/ 26 августа 2014

Чтобы избавиться от заголовка X-Powered-By без доступа к php.ini, просто добавьте пустой заголовок.

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

Это перезаписывает заголовок X-Powered-By по умолчанию с пустым значением, хотя большинство клиентов и приложений действуют так, как будто этот заголовок вообще не был отправлен.

Как отмечалось ранее, это должно быть вставлено в код перед отправкой любого вывода.

И ответить на ваш вопрос:

Будет отправлен только ваш заголовок X-Powered-By, поскольку он заменяется вашим заголовком с тем же именем. Таким образом, он не может быть обнаружен «сниффером».

1 голос
/ 02 июня 2012

Мой вопрос заключается в том, будет ли это отправлять предыдущий заголовок PHP первым (до того, как он достигнет моего header(), и будет ли он обнаруживаться какой-либо программой-сниффером?

Нет, предыдущий заголовок PHP не отправляется первым. Заголовки отправляются или не отправляются (полностью, как один пакет) в PHP. По умолчанию ваш вызов header Документы заменяет предыдущий заголовок с тем же именем (если вы не укажете что-то другое во втором параметре).

Примечание: Если PHP не будет собирать заголовки, он не сможет заменить один.

Поскольку он не отправлял его ранее, он не обнаруживается с помощью программы сниффера.

Так что да, заголовки собираются PHP и отправляются в тот момент, когда начинается «реальный» вывод (тело ответа HTTP).

См. Также headers_sent Документы .

...