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 地址。使用不可信的值會導致速率限制規避、訪問控制繞過、記憶體耗盡或其他負面的安全或可用性後果。
相反,最左邊的(不可信的)值只能在使用欺騙值不會產生負面影響的情況下使用。
語法
X-Forwarded-For: <client>, <proxy1>, <proxy2>
元素以逗號分隔,逗號周圍可能有可選的空格。
指令
- <client>
-
客戶端 IP 地址
- <proxy1>, <proxy2>
-
如果請求透過多個代理,則會列出每個後續代理的 IP 地址。這意味著,在客戶端和代理行為良好的情況下,最右邊的 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,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-ForIP 列表從最右邊開始搜尋,搜尋次數為該計數減一。(例如,如果只有一個反向代理,則該代理將新增客戶端的 IP 地址,因此應使用最右邊的地址。如果有三個反向代理,則最後兩個 IP 地址將是內部的)。 -
可信代理列表:配置了可信反向代理的 IP 或 IP 範圍。
X-Forwarded-ForIP 列表從最右邊開始搜尋,跳過可信代理列表上的所有地址。第一個不匹配的地址是目標地址。
第一個可信的X-Forwarded-For IP 地址可能屬於不可信的中間代理,而不是實際的客戶端計算機,但它是唯一適合安全用途的 IP。
請注意,如果伺服器可以直接從網際網路連線(即使它也位於可信的反向代理後面)——X-Forwarded-For IP 列表的任何部分都不能被視為可信或安全用於安全相關用途。
規範
不是任何當前規範的一部分。此標頭的標準化版本是Forwarded。