Laravel: trustProxies

どのプロキシから来た X-Forwarded-* を信じるかを決める設定(bootstrap/app.php)。

->withMiddleware(function (Middleware $middleware): void {
    $middleware->trustProxies(at: ['10.0.0.0/8']);            // この IP から来たときだけ信じる
    $middleware->trustHosts(at: ['^example\.com$']);          // 想定外の Host は拒否
})
  • 普段の流れ: ブラウザ → LB → アプリ。LB が「元の Host は example.com」と X-Forwarded-Host に書いて渡し、アプリはそれを見て URL を組み立てる

  • at: '*' は「誰が書いた X-Forwarded-* でも信じる」設定。LB を通らずアプリに直接届く経路があると、攻撃者が自分で書いたヘッダーもそのまま信じてしまう

    curl http://<アプリの IP>/forgot-password -H 'X-Forwarded-Host: evil.com' -d 'email=victim@example.com'
    

    → アプリは自分を evil.com だと思い込み、パスワードリセットのメールに https://evil.com/reset/<トークン> を載せる。メールは被害者のアドレスに本物のサービスから届く(攻撃者が変えられるのはリンクのドメインだけ)。リセットのフォームはログイン不要でメールアドレスを入れるだけなので、攻撃者が被害者のアドレスを入れれば、アプリはそのアカウント宛てに送る。被害者がそのリンクを踏むと、トークン付きの URL が evil.com に届き、攻撃者はそのトークンを本物の example.com で使ってパスワードを書き換える

  • trustHosts は「自分のホスト名はこれだけ」と許可リストを持たせる設定。Host が evil.com のリクエストはその時点で拒否するので、偽装されても URL は作られない