HTTPの応答ヘッダーに含まれるPHPバージョンを隠す方法
PHPをインストールした状態のままで使用していると、HTTPの応答ヘッダーにPHPのバージョンが表示され、セキュリティーホールを狙った攻撃を受ける可能性があるのでバージョン情報を隠す方法をご紹介します。
ヘッダー情報のサンプル(作業前)
Google Chrome をお使いの方は、F12 → Network → Name Path から該当のページをクリックすればヘッダー情報を見ることが出来ます。その他にも確認する方法は色々あります。
Cache-Control:no-cache, must-revalidate, max-age=0
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=UTF-8
Date:Sat, 12 Jul 2014 11:35:03 GMT
Expires:Wed, 11 Jan 1984 05:00:00 GMT
Link:<http://vpshiroba.com/>; rel=shortlink
Pragma:no-cache
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Pingback:http://vpshiroba.com/xmlrpc.php
X-Powered-By:PHP/5.4.1
PHPのバージョンが、「PHP/5.4.1」と表示され大変危険な状態です。早速、バージョンを表示しないように php.ini を修正します。
PHPのバージョンを隠す
php.ini を修正します。
expose_php = On → expose_php = Off に変更します。
;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
; http://php.net/expose-php
expose_php = On
↓
expose_php = Off
設定反映
// php5-fpmの場合
# /etc/init.d/php5-fpm reload
// Apache2の場合
# /etc/init.d/apache2 reload
ヘッダー情報のサンプル(作業後)
ヘッダー情報確認すると、「X-Powered-By:」の項目が消えたことが分ります。これでPHPバージョン表示の対策は完了です。
Cache-Control:no-cache, must-revalidate, max-age=0
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=UTF-8
Date:Sat, 12 Jul 2014 12:04:53 GMT
Expires:Wed, 11 Jan 1984 05:00:00 GMT
Link:<http://vpshiroba.com/>; rel=shortlink
Pragma:no-cache
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Pingback:http://vpshiroba.com/xmlrpc.php
サーバーを構築するときは、バージョンを隠す事を常に意識して構築してくださいね。
尚、PHPプログラムのバージョンを取得する関数 phpversion() には影響はありません。
2026年11月時点でも、PHP の既定値は expose_php = On のままです。Debian 13 のサーバー(PHP 8.5)で、何も変えていないコマンドライン用の設定を見ると On になっていました。Web 用(PHP-FPM)の php.ini は、Off に直した後です。
$ php -i | grep expose_php
expose_php => On => On
$ grep -n "^expose_php" /etc/php/8.5/fpm/php.ini
395:expose_php = Off
今の Debian では、php.ini は /etc/php/(版)/fpm/php.ini にあり、変更後は systemctl reload php8.4-fpm(版は環境に合わせる)で反映します。あわせて、Nginx の Server ヘッダーから版番号を消す設定もしておきます。
# /etc/nginx/nginx.conf の http { } の中
server_tokens off;
# nginx -t && systemctl reload nginx
$ curl -sI https://example.com/ | grep -iE "^(server|x-powered-by)"
server: nginx
| 見えるもの | 止める設定 | 書く場所 |
|---|---|---|
| X-Powered-By: PHP/8.x | expose_php = Off | php.ini(PHP-FPM 側) |
| Server: nginx/1.26.3 | server_tokens off; | nginx.conf の http { } |
| Server: Apache/2.4.x (Debian) | ServerTokens Prod と ServerSignature Off | /etc/apache2/conf-available/security.conf |
| 確かめる場所 | コマンド | 注意 |
|---|---|---|
| PHP-FPM の設定 | php-fpm8.4 -i | grep expose_php | php -i はコマンドライン用の php.ini を見る |
| 実際の応答 | curl -sI https://example.com/ | CDN の裏では Server が CDN の名前になる |
⚠ 2026年11月時点でも、バージョンを隠すのは攻撃の手間を少し増やすだけです。いちばん効くのは、セキュリティ更新を入れ続けることです。