X-Forwarded-For
X-Forwarded-For (XFF) ヘッダーは、 HTTP プロキシーサーバーを通過してウェブサーバーへ接続したクライアントの、送信元 IP アドレスを特定するために事実上の標準となっているヘッダーです。
警告: このヘッダーを適切に使用しない場合、セキュリティリスクがあります。詳細は セキュリティーとプライバシーの懸念 の項を確認してください。
クライアントがサーバーに直接接続を行った場合、クライアントの IP アドレスはサーバーに送信されます。(そして、しばしばサーバーのアクセスログに記録されます)しかし、クライアントの接続がフォワードプロキシー または リバースプロキシーを通過する場合はサーバーは最後のプロキシーの IP アドレスしかわからず、ほとんど役に立ちません。これは最後のプロキシーがサーバーの一部としてのロードバランサーである場合に特にあてはまります。そのため、より役に立つクライアント IP アドレスをサーバーに提供するために X-Forwarded-For
リクエストヘッダーが用いられます。
このヘッダーの詳しい使用方法は 構文解析 と IP アドレスの選択 の項を確認してください。
標準化されたヘッダーは HTTP Forwarded
ヘッダーです。
セキュリティーとプライバシーの懸念
このヘッダーは設計上、クライアントの IP アドレスなどプライバシーに関わる情報を公開します。それゆえに、このヘッダーを利用する場合はユーザーのプライバシーに留意する必要があります。
X-Forwarded-For
ヘッダーはクライアントとサーバーの間に信頼できるリバースプロキシー(例: ロードバランサーのような)が存在しない場合は信頼できません。もし、クライアントと全てのプロキシーが悪意がなく正しく振る舞う場合、ヘッダー内の IP アドレスのリストは ディレクティブ 項で説明された意味を持ちます。しかし、クライアントもしくはプロキシーに悪意がある、または設定ミスがある場合、ヘッダーの一部(もしくは全て)がなりすましの可能性があります。(もしくは、リストではないか IP アドレスを全く含まないか)
もし、信頼できるリバースプロキシーがクライアントとサーバーの間にある場合、最終的な X-Forwarded-For
IP アドレス(信頼できるプロキシーごとに1つ)は信頼できるプロキシーによって追加されたものなので、信頼できることになります。(サーバーがこれらのプロキシーを介してのみアクセスできて、かつ、直接アクセスできない場合に 限ります)
セキュリティのために X-Forwarded-For
を使用する場合(レートリミットや IP によるアクセス制限など)は信頼できるプロキシー によってのみ 追加された IP アドレスを使用しなければなりません。信頼できない値を使用した場合、レートリミットの回避、アクセス制限のバイパス、メモリの枯渇など、セキュリティや可用性に悪影響を及ぼす可能性があります。
逆に言うと、左端の(信頼できない)値はなりすましによる悪影響が無い場合にのみ使用します。
構文
X-Forwarded-For: <client>, <proxy1>, <proxy2>
要素はカンマ区切りで、前後に空白を含めることもできます。
ディレクティブ
- <client>
-
クライアントの IP アドレス
- <proxy1>, <proxy2>
-
要求が複数のプロキシーを通して行われる場合、それぞれの通過するプロキシーの IP アドレスが書き出されます。つまり、クライアントとプロキシーが悪意や設定ミスがなく、正しく振る舞った場合に、右端の IP アドレスが最も後のプロキシーであり、左端の IP アドレスが元のクライアントの IP アドレスです。
例
X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348 X-Forwarded-For: 203.0.113.195 X-Forwarded-For: 203.0.113.195, 2001:db8:85a3:8d3:1319:8a2e:370:7348 X-Forwarded-For: 203.0.113.195,2001:db8:85a3:8d3:1319:8a2e:370:7348,150.172.238.178
構文解析
X-Forwarded-For
ヘッダーを適切に解析しなかった場合、なりすましの値をセキュリティ関連用途に使用してしまう可能性があります。その結果、前述のような悪影響が発生します。
リクエストには複数の X-Forwarded-For
ヘッダーが含まれる可能性があります。(RFC2616によると)それらのヘッダーの IP アドレスは、最初のヘッダーの 最初の IP アドレスから最後のヘッダーの最後の IP アドレスまでをひとつながりの単一のリストとして扱う必要があります。これらを単一のリストとして扱うには2つの方法があります:
- 全ての
X-Forwarded-For
ヘッダーをカンマで結合してからカンマ区切りのリストにする、もしくは - 各々の
X-Forwarded-For
ヘッダーをカンマ区切りのリストにしてから結合する
複数の X-Forwarded-For
ヘッダーのうち1つだけ使用するのは不十分です。
(いくつかのリバースプロキシーは自動的に複数の X-Forwarded-For
ヘッダーを1つに結合します。しかし、そうであると推定しないのが最も安全です。)
IP アドレスの選択
アドレスを選択するときは、 IP の完全なリスト — 全ての X-Forwarded-For
ヘッダー — を使用する必要があります。
クライアントから最も近い X-Forwarded-For
の IP アドレスを選択する場合(信頼できない、かつ、セキュリティに関係の ない 目的で)は、左端から 有効 で プライベート/内部 ではない最初の IP アドレスを選択する必要があります。(なりすましの値は IP アドレスではない可能性があるため "有効" である必要があります。また、 "プライベート/内部アドレスではない" というのはクライアントが彼らの内部ネットワークのプロキシーを使用した可能性があり、その場合 プライベートネットワーク で IP アドレスが追加されている可能性があるためです。)
信頼できる 最初の X-Forwarded-For
クライアント IP アドレスを選択する場合、追加の設定が要求されます。これらは一般的に2つの方法があります:
- 信頼できるプロキシーの数: インターネットとサーバーの間のリバースプロキシーの数が設定されている。
X-Forwarded-For
IP リストは右端から1を引いて位置から検索されます。(例えば、リバースプロキシーが1つの場合は、そのプロキシーはクライアントの IP アドレスを追加するため右端の IP アドレスを使用するべきです。もし、リバースプロキシーが3つある場合、最後の2つの IP アドレスは内部のものになるでしょう。) - 信頼できるプロキシーのリスト: 信頼できるリバースプロキシーの IP リストもしくは IP の範囲が設定されている。
X-Forwarded-For
IP リストは右端から検索されますが、この時に信頼できるプロキシーリストのアドレスはスキップされます。信頼できるリストに一致しなかった最初のアドレスが目的のアドレスです。
最初の信頼できる X-Forwarded-For
IP アドレスは実際のクライアントコンピューターではなく信頼できない中間プロキシーのものかもしれません、しかし、それはセキュリティ用途のための唯一適した IP アドレスです。
サーバーがインターネットから直接接続可能な場合 — たとえ信頼できるリバースプロキシーの後ろに設置されていたとしても — X-Forwarded-For
IP リストはセキュリティ関連用途に使用するには信頼できないということに注意してください。
仕様書
現行のどの仕様書にも含まれていません。このヘッダーの標準化版は Forwarded
ヘッダーです。