REMOTE_ADDR、HTTP_X_FORWARDED_FOR、UserHostAddress獲取 IP 地址的區別詳解
發布時間:2021/12/16 16:09:49 作者:Admin 閱讀:1589
廣告:
REMOTE_ADDR 是離服務器“最近”的 IP。
沒有使用代理時,也就是客戶端 IP。
使用一層代理時,也就是代理的 IP。
使用多層代理時,也就是最近一個(最靠近服務器)的代理的 IP。
HTTP_X_FORWARDED_FOR 是從客戶端到 REMOTE_ADDR 前一個 IP。
沒有使用代理時,沒有值。
使用一層代理時,也就是客戶端 IP。
使用二層代理時,也就是“客戶端IP,1層代理IP”,也就是相當于 IP 路徑,中間用逗號隔開,注意不包括二層代理。
使用三層代理時,也就是“客戶端IP,1層代理IP,2層代理”,也就是相當于 IP 路徑,中間用逗號隔開,注意不包括三層代理。
……
注意:HTTP_X_FORWARDED_FOR 是 HTTP 頭的一部分,就像 HTTP_REFERER 一樣,是可以偽造的。這就造成一種情況,并沒有使用代理,我們卻認為使用了代理,而忽略了 REMOTE_ADDR 對應的是真實 IP。所以如果是做安全方面的記錄,最好把 REMOTE_ADDR、HTTP_X_FORWARDED_FOR 二者的值都記錄下來。
使用三層代理時經過的ip:
HTTP_X_FORWARDED_FOR (userrealip,dai1ip,dai2ip) + REMOTE_ADDR (dai3ip)
REMOTE_ADDR=Request.UserHostAddress
為了防止HTTP_X_FORWARDED_FOR偽造,又防止獲取到的REMOTE_ADDR是反向代理服務器(nginx)的ip,可以從右向左取HTTP_X_FORWARDED_FOR第一個值:
string[] splitter = { "," }; string[] IP_Array = User_IPAddressRange.Split(splitter, System.StringSplitOptions.None); int LatestItem = IP_Array.Length - 1; User_IPAddress = IP_Array[LatestItem];
廣告:
相關文章