X-Forwarded-For

X-Forwarded-For (XFF) 請求頭是用於識別透過代理伺服器連線到 Web 伺服器的客戶端原始 IP 地址的事實標準標頭。

警告:不正確使用此標頭可能會帶來安全風險。有關詳細資訊,請參閱安全和隱私問題部分。

當客戶端直接連線到伺服器時,客戶端的 IP 地址會發送到伺服器(並且通常會寫入伺服器訪問日誌)。但是,如果客戶端連線透過任何轉發或反向代理,則伺服器只能看到最終代理的 IP 地址,這通常用處不大。如果最終代理是與伺服器位於同一安裝中的負載均衡器,則尤其如此。因此,為了向伺服器提供更有用的客戶端 IP 地址,使用了X-Forwarded-For請求標頭。

有關使用此標頭的詳細指南,請參閱解析選擇 IP 地址部分。

標頭型別 請求標頭
禁止的標頭名稱

此標頭的標準化版本是 HTTP Forwarded 標頭。

安全和隱私問題

根據設計,此標頭會公開隱私敏感資訊,例如客戶端的 IP 地址。因此,在部署此標頭時必須牢記使用者的隱私。

當客戶端和伺服器之間沒有可信的反向代理(例如負載均衡器)時,X-Forwarded-For標頭是不可信的。如果客戶端和所有代理都是良性和行為良好的,則標頭中的 IP 地址列表具有指令部分中描述的含義。但是,如果存在客戶端或任何代理存在惡意或錯誤配置的風險,則標頭的任何部分(或全部)都可能被欺騙(並且可能不是列表或根本不包含 IP 地址)。

如果客戶端和伺服器之間存在任何可信的反向代理,則最終的X-Forwarded-For IP 地址(每個可信代理一個)是可信的,因為它們是由可信代理新增的。(只要伺服器只能透過這些代理訪問,而不能直接訪問,則為真)。

X-Forwarded-For的任何與安全相關的用途(例如速率限制或基於 IP 的訪問控制)只能使用可信代理新增的 IP 地址。使用不可信的值會導致速率限制規避、訪問控制繞過、記憶體耗盡或其他負面的安全或可用性後果。

相反,最左邊的(不可信的)值只能在使用欺騙值不會產生負面影響的情況下使用。

語法

http
X-Forwarded-For: <client>, <proxy1>, <proxy2>

元素以逗號分隔,逗號周圍可能有可選的空格。

指令

<client>

客戶端 IP 地址

<proxy1>, <proxy2>

如果請求透過多個代理,則會列出每個後續代理的 IP 地址。這意味著,在客戶端和代理行為良好的情況下,最右邊的 IP 地址是最新的代理的 IP 地址,最左邊的 IP 地址是原始客戶端的 IP 地址。

示例

http
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,198.51.100.178

解析

X-Forwarded-For標頭的解析不正確會導致欺騙值用於安全相關目的,從而導致上述負面後果。

請求中可能存在多個X-Forwarded-For標頭。這些標頭中的 IP 地址必須視為單個列表,從第一個標頭的第一個 IP 地址開始,一直持續到最後一個標頭的最後一個 IP 地址。有兩種方法可以建立此單個列表

  • X-Forwarded-For完整標頭值用逗號連線,然後按逗號拆分為列表,或者
  • 將每個X-Forwarded-For標頭按逗號拆分為列表,然後連線這些列表

僅使用多個X-Forwarded-For標頭中的一個是不夠的。

(某些反向代理會自動將多個X-Forwarded-For標頭連線到一個,但最安全的方法是不假設這種情況)。

選擇 IP 地址

選擇地址時,必須使用所有X-Forwarded-For標頭中的完整 IP 列表。

在選擇最靠近客戶端的X-Forwarded-For客戶端 IP 地址(不可信且用於安全相關目的)時,應選擇最左邊第一個有效地址不是私有/內部的地址。(“有效”是因為欺騙值可能根本不是 IP 地址;“不是內部/私有”是因為客戶端可能在其內部網路上使用了代理,這可能添加了來自私有 IP 空間的地址)。

在選擇第一個可信X-Forwarded-For客戶端 IP 地址時,需要額外的配置。有兩種常見的方法

  • 可信代理計數:配置了網際網路和伺服器之間的反向代理數量。X-Forwarded-For IP 列表從最右邊開始搜尋,搜尋次數為該計數減一。(例如,如果只有一個反向代理,則該代理將新增客戶端的 IP 地址,因此應使用最右邊的地址。如果有三個反向代理,則最後兩個 IP 地址將是內部的)。
  • 可信代理列表:配置了可信反向代理的 IP 或 IP 範圍。X-Forwarded-For IP 列表從最右邊開始搜尋,跳過可信代理列表上的所有地址。第一個不匹配的地址是目標地址。

第一個可信的X-Forwarded-For IP 地址可能屬於不可信的中間代理,而不是實際的客戶端計算機,但它是唯一適合安全用途的 IP。

請注意,如果伺服器可以直接從網際網路連線(即使它也位於可信的反向代理後面)——X-Forwarded-For IP 列表的任何部分都不能被視為可信或安全用於安全相關用途。

規範

不是任何當前規範的一部分。此標頭的標準化版本是Forwarded

另請參閱