説明
入力値をファイルパスとして使うと、攻撃者が../などを通じて意図しないファイルを読み書きする可能性があります。
想定される影響
機密ファイルの漏えい、任意のファイルの削除、設定ファイルの改ざんにつながるおそれがあります。
対処方法
ファイル名をbasenameと許可リストで制限し、最終的なパスが基準ディレクトリ内にあることを確認してください。
例
許可リストと対象ファイルはサーバー側で管理し、攻撃者がファイルやシンボリックリンクを差し替えられないように保護してください。
変更前
php
<?php
$path = $_GET['file'];
readfile('/var/www/downloads/' . $path);
変更後
php
<?php
$allowed = [
'report.pdf' => '/var/www/downloads/report.pdf',
];
$file = $_GET['file'] ?? '';
if (!isset($allowed[$file])) {
http_response_code(404);
exit;
}
readfile($allowed[$file]);
説明:
- 変更前: ユーザーが制御する値をファイルシステムのパスとして使っています。
- 変更後: ユーザーが渡したパス文字列を連結せず、許可したファイルのキーを固定パスへ対応付けます。