2025/07/23 10:18 What is X-Forwarded-For and when can you trust it? (2024)

やっほー、ロボ子!今日はX-Forwarded-Forヘッダーについて話すのじゃ!

博士、こんにちは。X-Forwarded-Forヘッダーですか。Webリクエストの送信元IPアドレスを伝えるものですよね。

そうそう!複数のサーバーやプロキシを経由するときに、本当の発信元を特定するのに役立つんじゃ。例えば、XFFヘッダーがないと、リクエストの直接の送信元しか分からなくなっちゃう。

なるほど。プロキシが「どこから来たかの履歴」を伝えるんですね。最後のプロキシは自分のIPアドレスを追加しない、と。

その通り!XFFヘッダーは色々な用途があるぞ。ユーザー認証、ロードバランシング、データローカリゼーション、地理的コンテンツ配信…

データローカリゼーションは、プライバシー法遵守のためですね。EUとかブラジル、中国とか。

そうじゃ!地理的コンテンツ配信は、CDNがユーザーの場所を特定して、一番近いサーバーからコンテンツを配信するから、遅延が少なくなるんじゃ。

アクセス制御やセキュリティにも使えるんですね。Webアプリケーションファイアウォール(WAF)で悪意のあるIPアドレスからのリクエストをフィルタリングしたり。

不正防止にも役立つぞ!金融機関とかで、ユーザーの場所に基づいて不正行為を検出したりするんじゃ。

APIレート制限にも使えるんですね。クライアントごとのリクエスト数を制限して、APIの不正利用を防ぐ、と。

そう!でもね、ロボ子。XFFヘッダーは完全に偽造可能だから、信頼性は低いんじゃ。

えっ、そうなんですか?悪意のある人が捏造することもできるんですね。

そうなんじゃ。だから、信頼できるリバースプロキシを使ったり、APIゲートウェイで処理したりする必要があるんじゃ。

nginxで`proxy_set_header X-Forwarded-For $remote_addr;`を使うと、クライアントの実際のIPアドレスでヘッダーを置き換えるんですね。

`proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;`を使うと、受信したアドレスをヘッダーに追加するんじゃ。元の値を保持したまま。

クライアントIPを特定するには、リストを右から左に読んで、自身が管理するIPアドレスでない最初のIPアドレスを使うんですね。

そうそう!信頼できるプロキシリストを作って、そのリストにないIPアドレスをクライアントIPとして認識したり、信頼できるプロキシ数を設定して、XFF IPリストを右から数えてスキップしたりするんじゃ。

XFFヘッダーを解析するときは、無効なIPアドレスとか、不正な区切り文字に注意が必要ですね。Log4Shellみたいな脆弱性対策として、ログシステムで入力のサニタイズ/エスケープも必要ですね。

その通り!Forwardedヘッダーっていう、XFFの進化版みたいなものもあるぞ。X-Forwarded-Protoの機能も組み込まれてて、拡張性があるんじゃ。

X-Forwarded-Host/Protoは、プロキシがオリジナルのHostヘッダーやプロトコルを転送するものですね。Viaヘッダーは、リクエストパス上の仲介者のデータを公開する、と。

他にも、X-Real-IPとか、CF-Connecting-IPとか、色々なヘッダーがあるんじゃ。

たくさんありますね!勉強になりました。

ところでロボ子、XFFヘッダーって、まるで忍者のように、本当の姿を隠すのに役立つと思わない?

そうですね。でも、忍者も偽装を見破られることがあるように、XFFヘッダーも注意が必要ですね。

うむ!まるで、お寿司屋さんで「今日はアジがいいよ!」って言われたのに、実は全部サバだったみたいなもんじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
