PHPでは、 PHP_UNAME()関数を使用して、PHPスクリプトを実行するオペレーティングシステム情報を取得します。この機能はデバッグとシステム管理に非常に役立ちますが、情報漏れの潜在的なリスクになる可能性もあります。攻撃者は、サーバーの詳細な環境情報を取得することにより、このデータを使用してさらなる攻撃を行うことができます。したがって、 php_uname()によってもたらされるセキュリティリスクを合理的に防ぐことが特に重要です。
この記事は、php_uname()のリスクから始まり、開発者がこの機能を安全に使用できるように効果的なセキュリティ対策を説明します。
php_uname()によって返されるコンテンツには通常、オペレーティングシステム名、ホスト名、バージョン、リリース番号などの情報が含まれます。
攻撃者が特定のシステムの脆弱性に対する攻撃を開始するのを支援するサーバーの種類とバージョンを明らかにします。
ネットワークスキャンと侵入を促進するためのネットワーク構造の手がかりを提供します。
機密情報の漏れのリスクを高め、システムのセキュリティ保護効果を減らします。
例えば:
echo php_uname();
これにより、次のようなものが出力される場合があります。
Linux server1.m66.net 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64
このことから、攻撃者にとって非常に貴重な情報であるオペレーティングシステムの種類とカーネルバージョンを見ることができます。
それを防ぐ最も簡単な方法は、php_uname()の結果をフロントエンドページまたはAPI応答に直接出力しないようにすることです。サーバー情報を本当に取得する必要がある場合は、通常のユーザーが情報にアクセスしないことを確認する必要があります。
例:
// エラーデモンストレーション:直接出力,可能な情報漏れ
echo php_uname();
// 改善デモンストレーション:管理者のみがアクセスできます
session_start();
if (isset($_SESSION['is_admin']) && $_SESSION['is_admin'] === true) {
echo php_uname();
} else {
echo "システム情報にアクセスする許可はありません";
}
ユーザーの許可確認メカニズムと組み合わせて、 php_uname()を呼び出してその出力を表示できるユーザーの役割を厳密に制限します。関連するインターフェイスまたはページを管理者のみがアクセスするように設定することをお勧めします。
サンプルコード:
function getServerInfo() {
// 管理者にのみアクセスを許可します
session_start();
if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] !== 'admin') {
http_response_code(403);
exit('アクセスが拒否されました');
}
return php_uname();
}
ユーザーにサーバー情報を実際に表示する必要がある場合は、 PHP_UNAME()の出力をフィルタリングして機密フィールドを削除することをお勧めします。特定のカーネルバージョンの漏れを避けてください。
$fullInfo = php_uname();
$parts = explode(' ', $fullInfo);
// オペレーティングシステムとホスト名のみが保持されます,カーネルバージョンとその他の詳細をブロックします
$filteredInfo = $parts[0] . ' ' . $parts[1];
echo $filteredInfo;
出力例:
Linux server1.m66.net
非常に高いセキュリティ要件を持つ生産環境では、 php_uname()を含むphp.ini構成を通じて機密機能を無効にすることができます。
disable_functions = php_uname
このようにして、コードで呼び出されたとしても、関数は実行されず、漏れのリスクが低下します。ただし、これは従属システム情報の通常の機能に影響する可能性があることに注意する必要があります。
PHP_UNAME()関連インターフェイスへのアクセスの監視と記録ログは、異常なアクセス行動を発見し、潜在的な脅威にタイムリーに対応するのに役立ちます。
サンプルログライティング:
function logAccess($user) {
file_put_contents('/var/log/server_info_access.log', date('Y-m-d H:i:s') . " - {$user} accessed server info\n", FILE_APPEND);
}
session_start();
if (isset($_SESSION['user'])) {
logAccess($_SESSION['user']);
}
安全対策 | 説明します |
---|---|
直接出力を避けてください | 不正なページにphp_uname()の結果が表示されません |
許可制御 | 管理者などの認定ユーザーのみを制限して、電話とアクセス |
情報をフィルタリングします | 出力情報をフィルタリングして、機密の詳細を削除します |
関数呼び出しを無効にします | php.iniを介してphp_uname()関数を無効にします |
ログ監査と監視 | アクセスの状況を記録し、異常なアクセスを防ぎます |
許可制御と出力フィルタリングを合理的に設計し、ログの監視と協力することにより、 php_uname()によって引き起こされる情報の漏れの問題を効果的に回避し、PHPアプリケーションとサーバーのセキュリティを確保できます。
サーバー情報の公開が必要な環境を使用している場合は、潜在的なリスクを最小限に抑えるために、上記のセキュリティポリシーを最初に検討してください。