ファイル読み込みパスの操作

ファイル読み込みパスの操作

説明

未検証の入力を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コードの実行につながる可能性があります。
  • 変更後: 許可したキーを固定のファイルへ対応付け、ユーザー入力をパスとして使いません。

参考資料