Я знаю в PHP, он отправляет заголовок X-Powered-By
чтобы иметь версию PHP.
Я также знаю, добавляя некоторые контрольные суммы, вы можете получить доступ к кредитам PHP и некоторым случайным изображениям ( подробнее здесь ).
Я также знаю, что в php.ini вы можете включить expose_php = off
.
Но вот что я сделал на нескольких сайтах, и это использование
header('X-Powered-By: Alex');
Когда я просматриваю заголовки, я вижу, что теперь это «Алекс», а не версия PHP. Мой вопрос заключается в том, будет ли он сначала отправлять предыдущий заголовок PHP (до того, как он достигнет моего header()
, и будет ли он обнаружен любой программой-сниффером? Или собираются заголовки «PHP» перед отправкой обратно в браузер?
Кстати, это не для безопасности по неизвестности, просто любопытно, как заголовки работают на PHP.
В PHP заголовки не отправляются, пока PHP не встретит свой первый вывод.
Это включает в себя что угодно до первого <?php
.
Именно поэтому setcookie отправляет предупреждение, если вы попытаетесь использовать его после того, как что-то было выведено:
Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки (вывод запущен в /path/to/php/file.php:100) в /path/to/php/file.php в строке 150
Обратите внимание, что ни одно из этого не применяется, если используется буферизация вывода , поскольку вывод не будет отправлен до тех пор, пока не будет выполнена соответствующая команда буферизации вывода.
Вы можете установить expose_php = Off
в php.ini, если вы не хотите, чтобы он отправлял заголовок X-Powered-By.
Сначала PHP компилирует все (включая заголовки, какие значения), а затем запускает вывод, а не наоборот.
PHP также обнаруживается со своими собственными пасхальными яйцами, вы можете прочитать об этом здесь: PHP Easter Eggs
См. Подсказки и хитрости Apache: скрыть версию PHP (X-Powered-By)
Ups … Как мы видим, PHP добавляет свой собственный баннер:
X-Powered-By: PHP/5.1.2-1+b1…
Давайте посмотрим, как мы можем его отключить. Чтобы предотвратить публикацию PHP на том факте, что он установлен на сервере, добавив свою подпись в заголовок веб-сервера, нам нужно найти в php.ini переменную
expose_php
и отключить ее.По умолчанию для параметра
expose_php
установлено значение Вкл.В php.ini (на основе вашего дистрибутива Linux это можно найти в разных местах, например /etc/php.ini, /etc/php5/apache2/php.ini и т. Д.), Найдите строку, содержащую
expose_php On
и установите ее отключен:expose_php = Off
После внесения этого изменения PHP больше не будет добавлять свою подпись к заголовку веб-сервера. Это сделает ваш сервер более безопасным … он просто запретит удаленным хостам легко видеть, что у вас установлен PHP в системе и какая версия вы используете.
Заголовки «собраны» PHP перед отправкой обратно в браузер, так что вы можете переопределить такие вещи, как заголовок состояния. Чтобы проверить это, перейдите в командную строку и введите:
telnet www.yoursite.com 80 GET /index.php HTTP/1.1 [ENTER] [ENTER]
И вы увидите заголовки, отправленные в ответ (замените /index.php URL-адрес вашей страницы PHP после домена.)
Чтобы избавиться от заголовка X-Powered-By без доступа к php.ini, просто добавьте пустой заголовок.
<?php header('X-Powered-By:'); ?>
Это перезаписывает заголовок X-Powered-By по умолчанию с пустым значением, хотя большинство клиентов и приложений действуют так, как будто этот заголовок не был отправлен вообще.
Как отмечалось ранее, это должно быть вставлено в код перед отправкой любого вывода.
И чтобы ответить на ваш вопрос:
Будет отправлен только ваш заголовок X-Powered-By, потому что он заменяется заголовком с тем же именем. Таким образом, он не может быть обнаружен «сниффером».
Мой вопрос заключается в том, будет ли он сначала отправлять предыдущий заголовок PHP (до того, как он достигнет моего
header()
, и будет ли он обнаружен любой программой-сниффером? Или собираются заголовки «PHP» перед отправкой обратно в браузер?
Нет, он не отправляет предыдущий заголовок PHP. Заголовки отправляются или не отправляются (полностью, как одна партия) в PHP. По умолчанию ваш header
Docs вызывает замену предыдущего заголовка с тем же именем (если вы не укажете что-то другое со вторым параметром).
Примечание. Если PHP не будет собирать заголовки, он не сможет его заменить.
Поскольку он не отправляется ранее, он не обнаруживается с помощью программы сниффера.
Итак, да, заголовки собраны PHP и отправляются в тот момент, когда начинается «настоящий» вывод (тело ответа HTTP).
См. Также headers_sent
Docs .