PHPを用いたWebアプリケーションの開発やサーバーの保守管理において、現在の環境設定を確認することは欠かせない作業です。
その際に最も頻繁に利用されるのが phpinfo() 関数ですが、この関数は強力である反面、取り扱いを誤ると重大なセキュリティリスクを招く可能性があります。
本記事では、PHP環境の構成情報を網羅的に表示する phpinfo() の正しい見方から、実務でチェックすべき重要項目、そして本番環境で露呈しやすいリスクと具体的な対策までを詳しく解説します。
開発効率を維持しつつ、セキュアなサーバー運用を実現するための知識を深めていきましょう。
phpinfo関数の基礎知識と実行方法
PHPには、現在のPHPの状態に関する膨大な情報を出力する phpinfo() という組み込み関数が用意されています。
これを利用することで、インストールされているPHPのバージョン、コンパイルオプション、拡張モジュール、環境変数、OSの情報などを一目で確認できます。
phpinfoを実行するプログラムの作成
実行方法は非常にシンプルです。
以下の内容を記述したPHPファイルをサーバー上に作成し、ブラウザからアクセスするだけで結果が表示されます。
<?php
// PHPの構成情報を出力する
phpinfo();
?>
一般的には info.php や phpinfo.php といったファイル名で保存されます。
実行結果はHTML形式で整形されて出力され、ブラウザ上で情報の検索 (Ctrl+F) も容易に行えるようになっています。
出力結果の構成
phpinfo() を実行すると、主に以下のセクションに分かれて情報が表示されます。
| セクション名 | 内容の概要 |
|---|---|
| System | サーバーのOS、ホスト名、カーネルのバージョン、ビルド日 |
| Build Date | PHPがビルドされた日時 |
| Configure Command | PHPをビルドした際のオプション設定(./configure …) |
| Server API | PHPが動作している方式(FPM/FastCGI, Apache 2.0 Handlerなど) |
| Configuration File Path | php.ini が配置されているデフォルトのパス |
| Loaded Configuration File | 現在実際に読み込まれている php.ini のフルパス |
| PHP Variables | 定義されているサーバー変数や環境変数 |
特に「Loaded Configuration File」の項目は重要です。 設定を変更したつもりでも反映されない場合、ここを確認することで「実は別の設定ファイルを読み込んでいた」というミスに気づくことができます。
運用時に必ず確認すべき重要項目
PHPの設定項目(ディレクティブ)は膨大ですが、トラブルシューティングやパフォーマンス調整、セキュリティ確認において特に注目すべき項目をいくつか挙げます。
これらは phpinfo() の「Core」セクションなどで確認可能です。
display_errors と log_errors
PHPプログラムでエラーが発生した際、その内容をブラウザに表示するかどうかを制御するのが display_errors です。
開発環境では On にすることでデバッグがスムーズになりますが、本番環境では必ず Off に設定しなければなりません。 エラーメッセージには、プログラムの内部構造やファイルパスが含まれるため、攻撃者にヒントを与えることになります。
一方で、エラー自体を記録しないと不具合の調査ができないため、log_errors は On に設定し、サーバー内のログファイルに出力するように構成するのが一般的です。
memory_limit
1つのPHPスクリプトが使用できる最大メモリ容量を指定します。
画像処理や大量のデータ処理を行うアプリケーションでは、デフォルトの 128M などでは不足することがあります。
現在の設定値が物理メモリや同時実行数に対して適切かどうかを確認し、必要に応じて php.ini で調整します。
post_max_size と upload_max_filesize
ファイルをアップロードする機能を実装している場合、これらの値が重要になります。
upload_max_filesize: アップロードを許可する1ファイルあたりの最大サイズ。post_max_size: POSTリクエスト全体で許可される最大サイズ。
一般的に、post_max_size は upload_max_filesize よりも大きな値に設定する必要があります。
phpinfoを公開し続けることのセキュリティリスク
phpinfo() は開発者にとって便利なツールですが、外部の第三者が閲覧できる状態にしておくことは、情報漏洩の観点から極めて危険です。
情報収集 (偵察行為) への加担
ハッカーが標的のサーバーを攻撃する際、最初に行うのが情報の収集です。
phpinfo() が公開されていると、攻撃者は以下の情報を労せずに入手できてしまいます。
- 正確なPHPのバージョン: 特定のバージョンに存在する脆弱性 (CVE) を利用した攻撃コードを選択しやすくなります。
- OSの種類とバージョン: Linuxのディストリストリビューションやカーネル情報から、OSレベルの脆弱性を突く準備が整います。
- 読み込まれているモジュール: 例えば、特定の拡張機能に脆弱性が見つかった場合、そのサーバーが標的になり得るか即座に判断されます。
- 内部ファイルパス: ドキュメントルートの絶対パスが判明するため、ディレクトリトラバーサル攻撃などの足がかりにされます。
環境変数に含まれる機密情報の露出
現代のWeb開発、特にDockerなどのコンテナ環境やクラウドサービスを利用している場合、データベースの接続パスワードやAPIキーを環境変数として渡す手法が一般的です。
phpinfo() の末尾付近にある「Environment」セクションには、これらの環境変数が生テキストのまま表示されます。
これを見られることは、システムの全権限を明け渡すのと同義です。
設定不備の露呈
先述した display_errors が On になっていることや、危険な関数を無効化する disable_functions が空であることなどが筒抜けになります。
これにより、攻撃者はどの程度の攻撃が通用するサーバーなのかを容易に見分けることができます。
推奨されるセキュリティ対策と安全な確認方法
セキュリティリスクを排除しつつ、必要な情報を確認するためのベストプラクティスを紹介します。
1. 確認後は直ちにファイルを削除する
最も確実で基本的な対策は、確認が終わったら即座にサーバー上からファイルを削除することです。
「後で使うかもしれないから」と放置するのが一番の危険です。
自動デプロイツールを使用している場合は、info.php のようなファイルが誤って本番環境に含まれないよう、.gitignore に登録しておく、あるいはビルドスクリプトで除外する設定を徹底しましょう。
2. アクセス制限をかける
どうしても恒久的にブラウザから確認したい理由がある場合は、Webサーバーの設定で閲覧制限をかけます。
.htaccess や Nginxの設定ファイルを用いて、許可された特定のIPアドレス(社内LANなど)からしかアクセスできないように制御します。
以下は .htaccess による制限の例です。
<Files "info.php">
Require ip 192.168.1.100
</Files>
3. CLI (コマンドライン) を活用する
サーバーにSSHでログインできる環境であれば、ブラウザを介さずに情報を確認するのが最も安全です。
以下のコマンドを実行することで、phpinfo() と同等の情報をテキスト形式で得ることができます。
# 全ての情報を表示
php -i
# 特定の項目だけを抽出して確認 (例: memory_limit)
php -i | grep memory_limit
この方法であれば、外部に公開されるリスクはなく、エンジニアだけが必要な情報を安全に取得できます。
4. 必要な値だけを個別に取得する
システム管理画面などで設定状況を表示したい場合は、phpinfo() をそのまま使うのではなく、ini_get() 関数を使用して必要な項目だけをピンポイントで取得するようにプログラミングしましょう。
<?php
// 特定の設定値だけを表示する
echo 'PHP Version: ' . phpversion() . "\n";
echo 'Memory Limit: ' . ini_get('memory_limit') . "\n";
echo 'Display Errors: ' . ini_get('display_errors') . "\n";
?>
このように、露出する情報を最小限に抑えることで、万が一閲覧された際のリスクを低減できます。
合わせてチェックしたいセキュリティ設定
phpinfo() を通じて確認しておくべき、PHP全体のセキュリティ向上に役立つ設定項目を紹介します。
expose_php を Off にする
デフォルトでは、HTTPレスポンスヘッダーに X-Powered-By: PHP/8.x.x のような情報が含まれます。
これを防ぐには、php.ini で以下のように設定します。
expose_php = Off
phpinfo() 上でこの項目が Off になっていることを確認してください。
これにより、外部からPHPを使用していること自体はわかっても、詳細なバージョンまでをヘッダーから特定されることを防げます。
allow_url_fopen と allow_url_include
外部サーバーのファイルをPHPから直接開くことができる設定です。
allow_url_fopen: 外部URLを指定してファイルを開く。allow_url_include: 外部URLのスクリプトをincludeする。
allow_url_include は極めて危険であり、必ず Off にすべきです。 これが On だと、リモートファイルインクルージョン (RFI) 脆弱性の原因となり、外部の悪意あるスクリプトを自社サーバーで実行されてしまう可能性があります。
disable_functions で危険な関数を制限する
サーバーのコマンドを実行できる関数など、Webアプリケーションで通常使わない強力な関数は無効化しておくのが推奨されます。
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
phpinfo() でこれらの関数が適切に disable_functions リストに含まれているか確認しましょう。
まとめ
phpinfo() は、PHP環境のすべてを明らかにする非常に便利なツールです。
設定ファイルのパス確認やモジュールの読み込み状況のチェックなど、開発やトラブルシューティングにおいて大きな力を発揮します。
しかし、その利便性の裏には、サーバーの機密情報をすべて外部にさらけ出してしまうという致命的なリスクが潜んでいます。
「本番環境では絶対に公開したままにしない」 という鉄則を常に意識してください。
情報の確認が必要な際は、可能な限りCLI (php -i) を利用し、やむを得ずブラウザから確認する場合も、IP制限の適用や即時のファイル削除を徹底することが重要です。
正しい知識を持ってツールを活用し、適切なセキュリティ設定を施すことで、安全で堅牢なWebアプリケーションの実行環境を維持していきましょう。
今回の内容を参考に、ぜひ一度ご自身の管理しているサーバーの設定状況を、安全な方法で再確認してみてください。
