Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
61
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

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

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;
  }
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
61
Help us understand the problem. What are the problem?