Lab 02〜04 を経て、うつろい journal は「正規化 + 境界チェック」アプローチを採用した。これで ../ 系の攻撃は全て防げるはず:
// PHP - realpath で正規化、prefix チェックで境界確認
$base = '/var/www/utsuroi/articles'; // ← 末尾スラッシュなし
$file = $_GET['file'];
$resolved = realpath($base . '/' . $file);
if ($resolved === false) abort(404);
// ★ バグ:末尾スラッシュ無しの prefix チェック
if (strpos($resolved, $base) !== 0) {
abort(403, 'Outside base directory');
}
return readfile($resolved);
意図は「$resolved が /var/www/utsuroi/articles/ 配下にあるか」。しかし $base に末尾スラッシュが無いので、/var/www/utsuroi/articles_evil/ のような兄弟ディレクトリも prefix 一致で通ってしまう。