X-Forwarded-For 頭
HTTP X-Forwarded-For (XFF) 請求頭是一個事實標準頭,用於識別客戶端透過代理伺服器連線到 Web 伺服器時的原始 IP 地址。
此頭的一個標準化版本是 HTTP Forwarded 頭,儘管其使用頻率要低得多。
警告:不當使用此頭可能會帶來安全風險。有關詳細資訊,請參閱安全和隱私問題部分。
語法
X-Forwarded-For: <client>, <proxy>
X-Forwarded-For: <client>, <proxy>, …, <proxyN>
例如,第一個頭中的 IPv6 客戶端 IP,第二個頭中的 IPv4 客戶端 IP,以及第三個示例中的 IPv4 客戶端 IP 和 IPv6 代理 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
指令
描述
當客戶端直接連線到伺服器時,客戶端的 IP 地址會發送到伺服器,並通常寫入伺服器訪問日誌。如果客戶端連線透過任何正向或反向代理,伺服器只會看到最終代理的 IP 地址,這通常用處不大。如果最終代理是與伺服器屬於同一部署的負載均衡器,則更是如此。為了向伺服器提供更有用的客戶端 IP 地址,使用了 X-Forwarded-For 請求頭。
安全和隱私問題
此頭按設計會暴露隱私敏感資訊,例如客戶端的 IP 地址。因此,在使用此頭時必須牢記使用者的隱私。
如果您知道請求鏈中的所有代理都是可信的(即您控制它們)並且配置正確,則您的代理新增的頭部分可以被信任。如果任何代理是惡意的或配置錯誤,則非可信代理新增的頭中任何部分都可能被欺騙,或者可能具有意外的格式或內容。如果伺服器可以直接從網際網路連線——即使它也位於可信的反向代理之後——則 X-Forwarded-For IP 列表的任何部分都不能被視為可信或安全用於安全相關用途。
任何將 X-Forwarded-For 用於安全相關用途(例如用於速率限制或基於 IP 的訪問控制)必須僅使用可信代理新增的 IP 地址。使用不可信的值可能導致繞過速率限制器、繞過訪問控制、記憶體耗盡或其他負面的安全或可用性後果。
最左側(不可信)的值只能用於使用欺騙值不會產生負面影響的情況。
解析
不當解析 X-Forwarded-For 頭可能會產生負面安全影響,其後果如上一節所述。因此,在解析頭值時應考慮以下幾點。
請求中可能存在多個 X-Forwarded-For 頭。這些頭中的 IP 地址必須被視為一個列表,從第一個頭的第一個 IP 地址開始,一直到最後一個頭的最後一個 IP 地址。有兩種方法可以建立這個單一列表:
- 用逗號連線
X-Forwarded-For的完整頭值,然後按逗號分割成一個列表,或者 - 將每個
X-Forwarded-For頭按逗號分割成列表,然後連線這些列表。
僅使用多個 X-Forwarded-For 頭中的一個是不夠的。
一些反向代理會自動將多個 X-Forwarded-For 頭合併為一個,但更安全的是不要假設總是如此。
選擇 IP 地址
選擇地址時,必須使用完整的 IP 列表(來自所有 X-Forwarded-For 頭)。
選擇最接近客戶端的 X-Forwarded-For IP 地址(不可信且不用於安全相關目的)時,應選擇從最左側開始的第一個有效地址且非私有/內部的 IP。
注意:我們上面說“有效地址”,因為欺騙值可能不是實際的 IP 地址。此外,我們說“非內部/私有”,因為客戶端可能在其內部網路上使用了代理,這可能添加了來自私有 IP 空間的地址。
選擇第一個可信的 X-Forwarded-For 客戶端 IP 地址需要額外的配置。有兩種常見方法:
- 可信代理計數
-
配置網際網路和伺服器之間的反向代理數量。
X-Forwarded-ForIP 列表從最右側開始,按該計數減一進行搜尋。例如,如果只有一個反向代理,該代理將新增客戶端的 IP 地址,因此應使用最右側的地址。如果有三個反向代理,則最後兩個 IP 地址將是內部地址。 - 可信代理列表
-
配置可信反向代理的 IP 或 IP 範圍。
X-Forwarded-ForIP 列表從最右側開始搜尋,跳過所有位於可信代理列表中的地址。第一個不匹配的地址是目標地址。
第一個可信的 X-Forwarded-For IP 地址可能屬於不可信的中間代理而不是實際客戶端,但它是唯一適合用於安全目的來識別客戶端的 IP。
示例
客戶端和代理 IP
從以下 X-Forwarded-For 請求頭中,我們可以推斷客戶端 IP 地址是 203.0.113.195,並且請求已透過兩個代理。第一個代理的 IPv6 地址是 2001:db8:85a3:8d3:1319:8a2e:370:7348,請求鏈中最後一個代理的 IPv4 地址是 198.51.100.178
X-Forwarded-For: 203.0.113.195,2001:db8:85a3:8d3:1319:8a2e:370:7348,198.51.100.178
規範
不屬於任何當前規範。此頭的標準化版本是Forwarded。
另見
X-Forwarded-Host、X-Forwarded-Proto頭ViaForwarded- 什麼是 X-Forwarded-For 以及何時可以信任它? httptoolkit.com (2024)