説明
未検証の入力をincludeやrequireのパスに使うと、ファイルの漏えいや意図しないPHPコードの実行につながる可能性があります。読み込めるファイルと影響は、ファイル権限やリモートファイル読み込みの設定などによって異なります。
想定される影響
機密ファイルの漏えい、認証の回避、意図しないPHPコードの実行につながるおそれがあります。
対処方法
読み込めるファイルをキーによる許可リストで固定し、ユーザー入力をパス文字列として直接使わないでください。
例
変更前
php
<?php
$file = $_GET['page'];
include($file);
変更後
php
<?php
$pages = [
'home' => __DIR__ . '/pages/home.php',
'help' => __DIR__ . '/pages/help.php',
];
$page = $_GET['page'] ?? 'home';
if (!isset($pages[$page])) {
http_response_code(404);
exit;
}
include $pages[$page];
説明:
- 変更前: ユーザーが制御する値をincludeやrequireに渡すため、ローカルファイルの漏えいや意図しないPHPコードの実行につながる可能性があります。
- 変更後: 許可したキーを固定のファイルへ対応付け、ユーザー入力をパスとして使いません。