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, (^^ゞ