Shikata Ga Nai

Private? There is no such things.

HTTP Hostヘッダー攻撃を防ぐには?

Hello there, ('ω')ノ

Hostヘッダーはユーザーが自由に書き換えられるため、信頼しすぎると非常に危険です。パスワードリセットリンクの改ざんやキャッシュポイズニングなど、深刻な被害につながります。


✅ 1. 絶対URLをできる限り使わない

<!-- NG例 -->
<a href="https://example.com/support">サポート</a>

<!-- OK例 -->
<a href="/support">サポート</a>

相対URLにできるところは相対URLを使うだけで安全性アップ


🔒 2. 絶対URLが必要な場合は「設定ファイル」を使う

パスワードリセットなど、どうしても絶対URLが必要なケースでは、次のようにサーバ設定から取得するようにします

// NG: Hostヘッダーを直接利用
$resetUrl = "https://" . $_SERVER['HTTP_HOST'] . "/reset";

// OK: サーバ設定から安全に取得
$resetUrl = "https://" . $config['domain'] . "/reset";

🧼 3. Hostヘッダーを使う場合はホワイトリストで検証

どうしてもHostヘッダーを使う必要があるときは、信頼できるドメインだけを明示的に許可しましょう。

Djangoではこのように設定できます:

ALLOWED_HOSTS = ["example.com", "www.example.com"]

❌ 4. X-Forwarded-Hostを無効にする/使用禁止にする

プロキシやCDNの裏で動くWebアプリでは、X-Forwarded-HostなどのヘッダーでHostが上書きされることがあります。

これも攻撃に使われることが多いため、できるだけ無効化する or 使用禁止にしましょう。


📛 5. 内部向けサイトを同じサーバに置かない

社内ツールなど、外部に公開すべきでないサイトを公開サイトと同じサーバでホストするのは危険です。

Hostヘッダーを使えば、外部から内部用ドメインにアクセス可能になる恐れがあります。


✍️ まとめ:防御のポイント

対策 効果
相対URLの使用 キャッシュポイズニング防止
設定ファイルでのドメイン管理 パスワードリセット攻撃防止
ホワイトリスト検証 Hostヘッダーインジェクション対策
X-Forwarded-Host無効化 プロキシ越しの改ざん防止
内部サイトとサーバ分離 情報漏洩・アクセス制御強化

Best regards, (^^ゞ