X-Forwarded-For中多個IP哪個是真實客戶端IP? - adam-p
直接上結論:如何從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 只是附加到已經存在的任何內容上。
詳細分析點選標題
相關文章
- 獲取客戶端真實IP客戶端
- .net 獲取客戶端真實ip客戶端
- java 獲取客戶端真實ipJava客戶端
- nginx多級代理下如何獲取客戶端真實IPNginx客戶端
- 伺服器獲取真實客戶端 IP伺服器客戶端
- 在容器服務中獲取客戶端真實源 IP客戶端
- Java面試題-如何獲取客戶端真實IPJava面試題客戶端
- Nginx 反向代理後如何獲取真實客戶端 IPNginx客戶端
- nginx反向代理獲取客戶端的真實IP和域名Nginx客戶端
- tomcat採集阿里雲slb真實客戶端ip🫚Tomcat阿里客戶端
- Istio 中實現客戶端源 IP 的保持客戶端
- websocket(多個客戶端)Web客戶端
- ABP vNext 審計日誌獲取真實客戶端IP客戶端
- 壓測的話, 壓測客戶端多 IP 和一個 IP 多埠進行壓測有區別嗎?客戶端
- pomelo獲取客戶端IP客戶端
- c# 獲取客戶端IPC#客戶端
- 在Intranet中獲得客戶端IP地址客戶端
- 在SelfHost專案中獲取客戶端IP地址客戶端
- java獲取客戶端ip和macJava客戶端Mac
- Xmanager用法(export DISPLAY=客戶端IP:0.0)Export客戶端
- 阿里雲CDN + nginx多級代理獲取客戶端IP阿里Nginx客戶端
- nginx後端獲取真實ipNginx後端
- 獲取SQL Server中連線的客戶端IP地址SQLServer客戶端
- Silverlight中利用WCF獲取客戶端IP客戶端
- 在OwinSelfHost專案中獲取客戶端IP地址客戶端
- PHP獲得真實客戶端的真實IPREMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FORPHP客戶端REMHTTPclientForward
- ftp客戶端軟體,ftp客戶端軟體哪個好用,使用方法FTP客戶端
- 監控database上的客戶端ip地址Database客戶端
- Django透過request獲取客戶端IPDjango客戶端
- 啟動多個zabbix_agented客戶端客戶端
- ntp客戶端配置多個時間源客戶端
- 笨辦法學C 練習45:一個簡單的TCP/IP客戶端TCP客戶端
- 怎麼看訪問連結是走了哪個IP
- 一次獲取客戶端 IP 記錄客戶端
- java web 通過request獲取客戶端IPJavaWeb客戶端
- 限制訪問Oracle客戶端IP方法總結Oracle客戶端
- 服務端如何獲取客戶端請求IP地址服務端客戶端
- 【Nginx】如何獲取客戶端真實IP、域名、協議、埠?看這一篇就夠了!Nginx客戶端協議