X-Forwarded-For中多個IP哪個是真實客戶端IP? - adam-p

banq發表於2022-03-06

直接上結論:如何從Http的標頭X-Forwarded-For(簡稱XFF)中尋找“真實客戶端 IP 地址”?請使用IP地址列表中最右側的 IP。
XFF 標頭中最左邊的 IP 通常被認為是“最接近客戶端”和“最真實”的,但它很容易被欺騙。不要將它用於任何與安全相關的事情。

Web 服務對其客戶的 IP 地址感興趣的原因有很多:地理統計、地理定位、審計、速率限制、濫用阻止、會話歷史等。
當客戶端直接連線到伺服器時,伺服器可以看到客戶端的 IP 地址。如果客戶端透過一個或多個代理連線(任何型別:正向、反向、負載均衡器、API 閘道器、TLS 解除安裝、IP 訪問控制等),那麼伺服器只能直接看到最終代理使用的 IP 地址客戶端連線。
為了將原始 IP 地址傳遞給伺服器,有幾個常用的標頭:
  • X-Forwarded-For 是一個以逗號分隔的IP列表,由請求路徑中經歷的每個代理伺服器追加的。我們的通常想法是:第一個IP(由第一個代理新增)是真正的客戶IP。每個後續的IP是沿著路徑的下一個代理。最後一個代理的IP是不存在的(因為代理不新增自己的IP,而且因為它直接連線到伺服器,所以它的IP將直接可用)。
  • Forwarded 是最正式但似乎最不常用的頭。它實際上只是XFF的一個高階版本。
  • 還有一些特殊的單IP頭,如X-Real-IP(Nginx)、CF-Connecting-IP(Cloudflare),或True-Client-IP(Cloudflare和Akamai)。

請注意:X-Forwarded-For使用和其他 HTTP 標頭獲取“真實客戶端 IP”的狀態非常糟糕。它執行不正確、不一致,並且結果使用不當。這導致了各種專案中的安全漏洞,並且肯定會在未來導致更多。
 
其他注意點:
當選擇最右邊的XFF IP時,確保使用標頭Header的最後最新的一個例項。
 
使用反向代理設定的特殊 "真正的客戶IP"(如X-Real-IP、True-Client-IP等)可能是好的,但這取決於
  • a)反向代理如何實際設定,
  • b)如果已經存在/欺騙,反向代理是否設定,以及
  • c)你如何配置反向代理(有時)。

任何不是由你的反向代理特別設定的頭Header都不能被信任。例如,如果你位於Nginx或其他會給標頭X-Real-IP賦值的代理後面,你一定不要檢查標頭X-Real-IP的值,因為你會讀到一個欺騙的值。
很多速率限制器的實現都在使用可欺騙的IP,容易受到速率限制器逃逸和記憶體耗盡的攻擊。
 
您必須始終注意,由不受您控制的任何代理新增(或似乎已新增)的任何 XFF IP 都是完全不可靠的。任何代理都可以按照它想要的方式新增、刪除或修改標頭。
例如,如果您向 AWS 負載均衡器2發出此請求……
curl -X POST https://my.load.balanced.domain/login -H "X-Forwarded-For: 1.2.3.4, 11.22.33.44"
負載均衡器後面的伺服器會得到這個:
X-Forwarded-For: 1.2.3.4, 11.22.33.44, <真實客戶端IP>
 
或者再次傳送請求:
curl -X POST https://my.load.balanced.domain/login -H "X-Forwarded-For: oh, hi,,127.0.0.1,,,,"
你會從XFF標頭中得到:
X-Forwarded-For: oh, hi,,127.0.0.1,,,,, <真實客戶端IP>

如您所見,已經存在的所有內容都只是未更改且未經驗證。最終的實際 IP 只是附加到已經存在的任何內容上。
 
詳細分析點選標題
 

相關文章