PHPアプリケーションを開発および展開するときは、 PHP_UNAME()関数を使用してシステムのオペレーティングシステム情報を取得する必要があることがよくあります。この関数は、現在のサーバーのオペレーティングシステム名、バージョン番号、ホスト名、その他の情報を返します。ただし、この情報は悪意のあるユーザーにさらされる可能性があり、それがシステムのセキュリティを脅かす可能性があります。したがって、生産環境では、 php_uname()関数の出力情報を非表示またはフィルタリングするための措置を講じる必要があります。
PHP_UNAME()は、現在のオペレーティングシステムに関する関連情報を返す組み込みのPHP関数です。その出力コンテンツには、オペレーティングシステムの名前、バージョン、ホスト名などが含まれ、通常の形式は次のとおりです。
echo php_uname();
出力例:
Linux server1 4.15.0-123-generic #126-Ubuntu SMP Thu Nov 7 18:59:47 UTC 2019 x86_64
この情報は開発者にとって有用かもしれませんが、不信感のあるユーザーにさらされた場合、攻撃者はこの情報を使用してシステムの構成と潜在的な脆弱性を推測できます。
php_uname()の出力情報は、次の機密コンテンツを漏らす可能性があります。
オペレーティングシステムの種類とバージョン:攻撃者は、この情報を使用して、どの脆弱性がシステムに影響を与える可能性があるかを判断できます。
ホスト名:ホスト名が公開されている場合、攻撃者はサーバーまたはネットワークトポロジの物理的位置を推測できる場合があります。
カーネルバージョン:一部のカーネルバージョンはすでにセキュリティの脆弱性を既知である可能性があり、攻撃者はこの情報を使用して攻撃を開始する場合があります。
したがって、生産環境では、セキュリティを改善するには、 php_uname()関数の出力を非表示またはフィルタリングする必要があります。
最も直接的な方法は、PHPのDisable_Functions構成を介して機能を無効にすることです。このメソッドは、php_uname()が呼び出されないようにします。
php.ini構成ファイルを開きます。
disabled_functions構成項目にphp_unameを追加します:
disable_functions = php_uname
PHPまたはWebサーバーを再起動して、構成を有効にします。
このアプローチを使用すると、 php_uname()関数を使用しようとするコードは実行からブロックされます。
php_uname()を完全に無効にすることができない場合は、カスタムコードを作成して出力をフィルタリングまたは変更することもできます。たとえば、関数の出力を書き換えることで、よりシンプルまたはより安全な情報を表示できます。
if ($_SERVER['SERVER_NAME'] === 'production_server') {
echo "Server Information Hidden for Security";
} else {
echo php_uname();
}
このコードでは、 php_uname()の出力は特定のサーバー環境でのみ表示されます。それ以外の場合、隠されたプロンプトメッセージが表示されます。
Apacheサーバーの場合、 .htaccessファイルを使用していくつかの機密情報をブロックすることができます。
たとえば、アクセス制御はmod_rewriteを介して実行され、特定の機密情報が公開されないようにします。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/php_uname$
RewriteRule .* - [F]
</IfModule>
この構成は、php_uname()への直接リクエストを拒否します。
open_basedir制限を構成することにより、PHPスクリプトは特定のディレクトリのみにアクセスできることを制御でき、公開されるべきではないシステム情報の読み取りを防ぐことができます。
php.ini構成ファイルを開きます。
configure open_basedir :
open_basedir = /path/to/your/application:/path/to/other/allowed/directories
この構成は、指定されたディレクトリのみにアクセスするためにPHPスクリプトを制限するため、システムに敏感な情報の漏れを回避します。
生産環境でのPHPアプリケーションのセキュリティを改善し、 PHP_UNAME()関数がシステムに敏感な情報を漏らすのを防ぐために、関数を無効にしたり、出力コンテンツを変更したり、構成ファイルを使用したり、制御メソッドにアクセスして制限を制限することを選択できます。これを行う最良の方法は、複数の方法を組み合わせて、機密情報が信頼されていないユーザーにさらされないようにすることです。