phpinfo()っぽいイースターエッグ、PHP Credits

PHPを使っている人ならば、phpinfo()の出力は見慣れていることと思う。

が、これに似た以下のような画面を見たことがある人は少ないのではなかろうか。

これは、"PHP Credits"というPHP開発者を紹介する画面で、PHPイースターエッグである。というわけで、この辺のお話。

イースターエッグとは

本来この言葉は、復活祭(Easter)に出されるカラフルに彩色されたゆで卵のこと。イースターの日、この卵をあちこちに隠して見つけ出すという遊びをすることから、転じてコンピュータ業界では、ソフトウェアのちょっとした隠し機能を指す。

例えばMicrosoft Excel 2000では、特定の操作をすることでスタッフロールが表示される、なんてのが有名だった。

PHPイースターエッグ

PHPでは、GET引数の特殊なパラメタに、ちょっとしたイースターエッグが隠されている。なお、これを発動させるには、php.iniの設定ファイル上で以下の通り設定されている必要がある(デフォルト設定)。

expose_php = On

実際に見てみるには、Webサーバ上のどのPHPファイルでも良いので、以下のような引数を付ければ良い。便宜上、ここではtest.phpとして例示する。

PHP Credits
test.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
PHPロゴ画像
test.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42

Zend Engineロゴ画像
test.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42

PHPロゴ画像(パロディ)
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

歴史をひもとくと、本来はこのパロディ画像だけがイースターエッグと呼ぶべきものだったらしい。ただし最近のバージョンのPHPでは、このパロディ画像機能だけは削除されている(理由は後述)。

どのバージョンでどんな画像が出るかは、以下のページにまとめられている。

セキュリティ的にどうなのか

このイースターエッグ、セキュリティ的にどうなのかという問いが色々あるだろうけど、一言でいえば「あまり問題無い」と言って良いと思う。

色々と着目点があるので、その辺の話が混乱されて語られることが多い。そのため、以下、ひとつひとつ解説する。

PHP Creditsはphpinfoでは無い

見た目がそっくりのため時々勘違いしている人がいるのだが、PHP Creditsはただのスタッフロールなので、phpinfo()のようにバージョン情報やインストール情報は一切含まれない。(phpinfoのパロディでしか無いのだが、そこを理解していない人が時々、これを「phpinfoだ!」と騒いだりする^^;)。

よって、これが出ているからと言って何かセキュリティ的に問題なわけではない。

PHPロゴ画像(パロディ風)

この機能は、最近(5.5以上?)のPHPからは削られている。バージョンごとに違うパロディ画像が用意されていたため、画像によってPHPのバージョンが確定できてしまう点が嫌われたのだと思う。もっとも、次に述べる通り、このイースターエッグ発動の時点でバージョン番号はレスポンスヘッダから分かるので、そこを問題とするのはちょっと違う(と思う)。

バージョン露出とexpose_php

このイースターエッグが気になる人は、バナー情報としてサーバ側のPHPのバージョンが分かってしまうのでは……ということを気にしているのだろう。結論から言えば「分かる」が、「それはイースターエッグのせいではない」。

そもそもこのイースターエッグが発動するには、先に書いた通りphp.iniのexpose_phpがOnになっている必要がある。この場合、全てのPHPアプリのレスポンスヘッダには以下のような「X-Powered-By」ヘッダが付くので、PHPバージョンは元からダダ漏れである。

HTTP/1.1 200 OK
Date: Mon, 25 Aug 2014 12:30:21 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

つまり、バージョン情報を隠蔽したければそもそもexpose_phpをOffにするべきだし、もしそうしていればこのイースターエッグは発動しない。

まとめ

  • PHP Creditsが見えたからと言って、それはphpinfoではない。だから、重大なセキュリティ問題があるわけではない。
  • ただし、見えた場合はexpose_phpがOnになっているから、バージョン情報を隠蔽したい人はOffにした方がいい。
    • これは「X-Powered-Byを隠すため」であって、「イースターエッグを発動させないため」ではないことは理解しよう。