Пожалуй, всем известно, что сегодня, 4 апреля 2010 года, и католики и православные отмечают Пасху. Пользуясь случаем, я решил написать статью о пасхальных яйцах, только не таких, которые красят, а о тех, происхождение которых связано с тематикой Хабра. Речь пойдёт о пасхальных яйцах языка PHP.
Вкратце: Оказывается, если добавить особую строчку к GET-запросу, обрабатываемому интерпретатором PHP, можно заставить сервер вернуть «секретную» картинку, либо информацию о разработчиках PHP. Примеры:
http://vkontakte.ru/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
http://ru.wikipedia.org/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
http://www.liveinternet.com/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
В чём
Сразу хочется подчеркнуть, что пасхальные яйца PHP, о которых пойдёт речь, абсолютно безобидны. Их существование никак не может отрицательно сказаться на работе сайта. Как я уже сказал, существует несколько особых строчек (назовём их сигнатурами), добавление которых к запросу ВНЕЗАПНО меняет ответ сервера. Синтаксически сигнатура должна являться значением безымянной и единственнойGET-переменной (например,
Вот эти самые сигнатуры и результаты их вставки:
Кто захочет, может дополнительно убить несколько минуток жизни, посмотрев список засветившихся в Гугле сайтов с первой сигнатурой в URL.
Код-виновник всех этих «чудес» довольно несложно найти в исходниках интерпретатора.
Сами сигнатуры описаны в файле
За возврат необычных ответов на необычные запросы отвечает функция
Все три изображения (логотип Zend, логотип PHP, забавная картинка) имеют формат GIF и хранятся в виде массивов байт в файле
Если Вы администрируете написанный на PHP сайт, Вы, скорее всего, уже попробовали провернуть этот трюк со своим проектом. Если пасхальное яйцо «работает», то Вы, вероятно, уже решили от него избавиться. Сделать это чрезвычайно просто.
Достаточно открыть у себя на сервере файл
После перезагрузки веб-сервера картинки и страница с информацией о разработчиках перестанут появляться — необычные запросы начнут обрабатываться в обычном режиме. Также сервер прекратит добавлять строку «
Избавившись от этого «ужасного хака», Вам удастся всего лишь скрыть факт того, что Ваш сайт использует PHP. Конечно, это относится только к проектам с ЧПУ (да и то далеко не всем). Если же ссылки на Вашем сайте имеют вид «
Несмотря на кажущуюся бесполезность, у описанного пасхального яйца есть практическое применение. Если на своём сайте вывести информацию о системе с помощью функцииwww.it.tsu.ge/info.php (сайт не мой, я просто разместил объяву ссылку). Ещё пример: hosting.iptcom.net/phpinfo.php (оказывается, картинка с логотипом Zend была совсем другой в версии PHP 4.4.4). Пример сайта с выключенной опцией help.secureserver.net/linux-phpinfo.html.
Изучая исходники PHP, я случайно наткнулся на источник ещё одного забавного секрета, несколько раз упомянутого в Интернете. Оказывается, что 1 апреля логотип, генерируемый функциейPHPE9568F36-D428-11d2-A769-00AA001ACF42). Получается, что в этот день логотип поменяется и на странице, полученной с помощью
В исходниках версии 5.2.13 за это «яйцо» отвечают строчки1237-1238 файла . Жаль, что увидеть в действии его можно только почти через год. Хотя, нетерпеливые товарищи в любой момент могут поменять системную дату. ;)
К концу написания статьи выяснилось, что есть ещё одна сигнатура, которая работает в PHP 5. Для этого пасхального яйца нужно, чтобы было включено расширение Suhosin (оно используется для усиления безопасности PHP). Сигнатура такая:SUHO8567F54-D428-14d2-A769-00DA302A5F18 . Результатом добавления её в запрос является картинка с тремя иероглифами, которые переводятся с корейского примерно как защитник или ангел-хранитель.
Этот пример не работает на php.net, зато прекрасно демонстрируется на сайте php.ru и на «горячо любимом» всеми нами ВКонтакте (через раз, так как Suhosin установлено не на все серверы).
Хорошо, когда люди, разрабатывающие серьёзные вещи, имеют чувство юмора и позволяют себе безобидно пошутить. К тому же пасхальные яйца — неплохая вирусная реклама своего продукта (фактически, я сейчас бесплатно рекламирую PHP). Главное здесь для разработчиков — не переусердствовать.
P.S.: Я понимаю, что для некоторых хабровчан описанный факт покажется бородатым и неинтересным, но уверен, что кто-то слышит о пасхальных яйцах в PHP впервые. Лично я узнал обо всём этом совсем недавно, хотя первый мойphp-файл был создан около 5 лет назад.
Если сегодня найдутся желающие написать про пасхальные яйца в других средах или языках программирования, можно устроить целый пасхальнояичный день на Хабре, Главное — чтобы потом НЛО по голове на настучало за оффтоп и не разместило на главной фразу «Прекращайте уже писатьпро яйца!». :)
Ссылки на источники и ресурсы:
ru.wikipedia.org/wiki/PHP, blogoscoped.com/archive/2006-01-08-n31.html, www.0php.com/php_easter_egg.php,www.drupal.ru/node/19682 , php.net, commons.wikimedia.org/wiki/File:Vajicka1.jpg; картинки лежат на imageshack.
Вкратце: Оказывается, если добавить особую строчку к GET-запросу, обрабатываемому интерпретатором PHP, можно заставить сервер вернуть «секретную» картинку, либо информацию о разработчиках PHP. Примеры:
http://vkontakte.ru/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
http://ru.wikipedia.org/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
http://www.liveinternet.com/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
В чём желток соль?
Сразу хочется подчеркнуть, что пасхальные яйца PHP, о которых пойдёт речь, абсолютно безобидны. Их существование никак не может отрицательно сказаться на работе сайта. Как я уже сказал, существует несколько особых строчек (назовём их сигнатурами), добавление которых к запросу ВНЕЗАПНО меняет ответ сервера. Синтаксически сигнатура должна являться значением безымянной и единственной
mypage.php?=×××
).Вот эти самые сигнатуры и результаты их вставки:
- PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 — список разработчиков PHP (PHP Credits).
- PHPE9568F34-D428-11d2-A769-00AA001ACF42 — логотип PHP.
- PHPE9568F35-D428-11d2-A769-00AA001ACF42 — логотип Zend.
- PHPE9568F36-D428-11d2-A769-00AA001ACF42 — забавная картинка, отличающаяся в разных версиях PHP:
- Thies C. Arntzen, один из разработчиков языка
(версии 4.0.1 — 4.2.2).
- Коричневая такса по кличке Nadia одного из членов команды по имени Stig Bakken
(версии 4.3.2 — 4.3.10).
- Чёрный шотландский терьер по кличке Scotch разработчика Zeev Suraski
(версии 4.3.11 — 4.4.4, 5.0.5 — 5.1.2).
- Кролик
(версии 4.3.1, 5.0.0, 5.0.3).
- Искажённый логотип PHP
(версии 5.1.4 — 5.2.?).
- Талисман PHP «elePHPant»
(некоторые версии 5.2.?).
- Thies C. Arntzen, один из разработчиков языка
Кто захочет, может дополнительно убить несколько минуток жизни, посмотрев список засветившихся в Гугле сайтов с первой сигнатурой в URL.
Как это работает?
Код-виновник всех этих «чудес» довольно несложно найти в исходниках интерпретатора.
Сами сигнатуры описаны в файле
ext/standard/info.h
в строчках 53−56:#define PHP_LOGO_GUID "PHPE9568F34-D428-11d2-A769-00AA001ACF42"
#define PHP_EGG_LOGO_GUID "PHPE9568F36-D428-11d2-A769-00AA001ACF42"
#define ZEND_LOGO_GUID "PHPE9568F35-D428-11d2-A769-00AA001ACF42"
#define PHP_CREDITS_GUID "PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000"
За возврат необычных ответов на необычные запросы отвечает функция
php_handle_special_queries()
совместно с функциями php_info_logos()
и php_print_credits()
. В свою очередь, php_handle_special_queries()
вызывается внутри функции php_execute_script()
.Все три изображения (логотип Zend, логотип PHP, забавная картинка) имеют формат GIF и хранятся в виде массивов байт в файле
main/logos.h
.Можно ли как-то это отключить?
Если Вы администрируете написанный на PHP сайт, Вы, скорее всего, уже попробовали провернуть этот трюк со своим проектом. Если пасхальное яйцо «работает», то Вы, вероятно, уже решили от него избавиться. Сделать это чрезвычайно просто.
Достаточно открыть у себя на сервере файл
php.ini
, найти параметр expose_php
и поменять его значение на «off»:expose_php = off
После перезагрузки веб-сервера картинки и страница с информацией о разработчиках перестанут появляться — необычные запросы начнут обрабатываться в обычном режиме. Также сервер прекратит добавлять строку «
X-Powered-By: PHP/×.×.× ...
» в HTTP-заголовки ответов, упоминание о PHP уберётся из строки «Server: ...
» (если оно сейчас там есть).Избавившись от этого «ужасного хака», Вам удастся всего лишь скрыть факт того, что Ваш сайт использует PHP. Конечно, это относится только к проектам с ЧПУ (да и то далеко не всем). Если же ссылки на Вашем сайте имеют вид «
my_cosy_guestbook.php?do=delete_all
», Вас это, естественно, не спасёт. Перед поиском и изменением файла php.ini
обязательно не забудьте для себя ответить на вопрос: «А оно мне надо?».Применение в хозяйстве
Несмотря на кажущуюся бесполезность, у описанного пасхального яйца есть практическое применение. Если на своём сайте вывести информацию о системе с помощью функции
phpinfo()
, Вы увидите логотипы PHP и Zend, а также ссылку «PHP Credits». По какому URI будут запрошены картинки, и куда будет вести ссылка на список разработчиков, догадаться теперь совсем несложно. Ресурсы получаются доступными, даже если сайт тестируется на локальной машине, не имеющей доступ в Интернет. Это работает только при включенной опции expose_php
(иначе картинки и ссылка не отображаются). Вот рабочий пример: expose_php
на сервере: Яйцо-бонус
Изучая исходники PHP, я случайно наткнулся на источник ещё одного забавного секрета, несколько раз упомянутого в Интернете. Оказывается, что 1 апреля логотип, генерируемый функцией
php_logo_guid()
, заменяется забавной картинкой (как для случая с сигнатурой phpinfo()
.В исходниках версии 5.2.13 за это «яйцо» отвечают строчки
ext/standard/info.c
Яйцо-бонус № 2
К концу написания статьи выяснилось, что есть ещё одна сигнатура, которая работает в PHP 5. Для этого пасхального яйца нужно, чтобы было включено расширение Suhosin (оно используется для усиления безопасности PHP). Сигнатура такая:
Этот пример не работает на php.net, зато прекрасно демонстрируется на сайте php.ru и на «горячо любимом» всеми нами ВКонтакте (через раз, так как Suhosin установлено не на все серверы).
Вывод
Хорошо, когда люди, разрабатывающие серьёзные вещи, имеют чувство юмора и позволяют себе безобидно пошутить. К тому же пасхальные яйца — неплохая вирусная реклама своего продукта (фактически, я сейчас бесплатно рекламирую PHP). Главное здесь для разработчиков — не переусердствовать.
P.S.: Я понимаю, что для некоторых хабровчан описанный факт покажется бородатым и неинтересным, но уверен, что кто-то слышит о пасхальных яйцах в PHP впервые. Лично я узнал обо всём этом совсем недавно, хотя первый мой
Если сегодня найдутся желающие написать про пасхальные яйца в других средах или языках программирования, можно устроить целый пасхальнояичный день на Хабре, Главное — чтобы потом НЛО по голове на настучало за оффтоп и не разместило на главной фразу «Прекращайте уже писать
Ссылки на источники и ресурсы:
ru.wikipedia.org/wiki/PHP, blogoscoped.com/archive/2006-01-08-n31.html, www.0php.com/php_easter_egg.php,