Lab 02 を受けて、うつろい EC は「文字列ブラックリストではなく、DNS 解決後の IP で検証」する正しいアプローチに改善した。
// 一見正しい実装 $host = parse_url($_POST['url'], PHP_URL_HOST); $ip = gethostbyname($host); // ← ① DNS 解決(検証用) if (is_internal_ip($ip)) abort(400); // ... その後 ... $content = file_get_contents($_POST['url']); // ← ② 実際に URL を fetch(再度 DNS 解決)
しかしこの実装には「2回の DNS 解決」という致命的なバグがある。攻撃者がコントロールするドメインの DNS が、① の解決時には public IP を、② の解決時には private IP を返すと、検証は素通りして実際のリクエストは内部 IP に到達する。これが DNS Rebinding。