PHPのX-Powered-Byヘッダを送らないようにする方法

  • 34
    いいね
  • 1
    コメント

PHPはデフォルトで稼働しているPHPのバージョンをHTTPヘッダに乗せてレスポンスを返しているって知っていました?意外と知らない人多いんじゃないかと思います。PHPスクリプトにHTTP Requestすると、このような詳細なバージョンがヘッダが帰ってきます。

X-Powered-By:PHP/5.4.0

バージョンがわかったところですぐに問題になるかと言えば微妙ですが、攻撃者がヘッダを解析するだけでPHPのバージョンを特定できるので、攻撃の事前調査などに悪用されることが考えられます。

X-Powered-Byヘッダを送らないようにする方法としては、3種類あります。1つ目は、php.iniでexpose_php = Offをセットする方法です。これで、X-Powered-Byヘッダは送信されなくなります。ただし、expose_phpを変更可能なのはphp.ini のみなので、.htaccessに書いたり、set_ini()でセットしたりするのは効果がありません。

php.ini
expose_php = Off

2つ目は、X-Powered-Byを置き換える方法です。header()で無理やりX-Powered-Byを送信すれば、PHPのバージョンは露出しなくなります。結局はX-Powered-Byを送信しているので、「PHPで動いているな」というのはだいたい予想がついてしまいます。できれば、X-Powered-Byヘッダ自体を送らないようにしたいですね。

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

3つ目は、header_register_callback()を利用する方法です。この関数はPHP5.4で追加されたようで、ヘッダを送信する直前にコールされる関数を指定することができます。この関数を使うと、なんとヘッダを除去したり、追加したりできるのです。下の例は、X-Powered-Byヘッダを除去するものです。これでX-Powered-Byが送信されなくなります。

<?php

header_register_callback(function(){
    header_remove('X-Powered-By');
});

php.iniが編集できる環境であれば、expose_php = Offをセットするのが一番いいですが、例えば共有レンタルサーバでは3つ目の方法が有効に思えます。また、オープンソースとして配布するようなユーザの環境を特定できない場合も、3つ目の方法が役にたつと思います。

番外編: Nginx + PHP-FPM構成でNginx側で消す方法

Nginx + PHP-FPM構成でphp.iniがどうしても編集できない場合は、Nginx側(リバースプロキシ側)でX-Powered-Byヘッダを隠蔽することができます。fastcgi_hide_header X-Powered-By;をnginxの設定に追加します。

  location ~ \.php$ {
    fastcgi_pass  localhost:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_hide_header X-Powered-By;
    include       fastcgi_params;
  }