REMOTE_ADDR、HTTP_X_FORWARDED_FOR、UserHostAddress獲取 IP 地址的區(qū)別詳解
廣告:
REMOTE_ADDR 是離服務(wù)器“最近”的 IP。
沒(méi)有使用代理時(shí),也就是客戶(hù)端 IP。
使用一層代理時(shí),也就是代理的 IP。
使用多層代理時(shí),也就是最近一個(gè)(最靠近服務(wù)器)的代理的 IP。
HTTP_X_FORWARDED_FOR 是從客戶(hù)端到 REMOTE_ADDR 前一個(gè) IP。
沒(méi)有使用代理時(shí),沒(méi)有值。
使用一層代理時(shí),也就是客戶(hù)端 IP。
使用二層代理時(shí),也就是“客戶(hù)端IP,1層代理IP”,也就是相當(dāng)于 IP 路徑,中間用逗號(hào)隔開(kāi),注意不包括二層代理。
使用三層代理時(shí),也就是“客戶(hù)端IP,1層代理IP,2層代理”,也就是相當(dāng)于 IP 路徑,中間用逗號(hào)隔開(kāi),注意不包括三層代理。
……
注意:HTTP_X_FORWARDED_FOR 是 HTTP 頭的一部分,就像 HTTP_REFERER 一樣,是可以偽造的。這就造成一種情況,并沒(méi)有使用代理,我們卻認(rèn)為使用了代理,而忽略了 REMOTE_ADDR 對(duì)應(yīng)的是真實(shí) IP。所以如果是做安全方面的記錄,最好把 REMOTE_ADDR、HTTP_X_FORWARDED_FOR 二者的值都記錄下來(lái)。
使用三層代理時(shí)經(jīng)過(guò)的ip:
HTTP_X_FORWARDED_FOR (userrealip,dai1ip,dai2ip) + REMOTE_ADDR (dai3ip)
REMOTE_ADDR=Request.UserHostAddress
為了防止HTTP_X_FORWARDED_FOR偽造,又防止獲取到的REMOTE_ADDR是反向代理服務(wù)器(nginx)的ip,可以從右向左取HTTP_X_FORWARDED_FOR第一個(gè)值:
string[] splitter = { "," };
string[] IP_Array = User_IPAddressRange.Split(splitter, System.StringSplitOptions.None);
int LatestItem = IP_Array.Length - 1;
User_IPAddress = IP_Array[LatestItem];
廣告:


