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 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にするべきだし、もしそうしていればこのイースターエッグは発動しない。