ASP.net 獲得客戶端的IP,最常見的是使用下述代碼:
代碼如下:
string user_IP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
對于了解代理服務器情況的人,我們會知道,如果用戶使用了代理服務器,上述代碼獲得的是代理服務器的IP地址;如果用戶使用了多個代理服務器,則是到達服務器的最后一個代理服務器的IP地址。
REMOTE_ADDR 說明:
訪問客戶端的 IP 地址。
此項信息用戶不可以修改。
如果真的給改了的話,你也和服務器連接不了了,服務器就是按照這個來與客戶端建立連接并進行通訊的。實際我測試修改這個 ServerVariables , 一點效果都沒有。仍然獲得是實際的值。
另: Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"] 實際是同一個值。
如何繞過代理服務器獲得用戶真實的IP地址呢? 這時候我們一般是類似如下的代碼(這里我簡單起見,沒有作一些邊界判斷)
private static string getIp(){
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
return System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(new char[]{','})[0];
else
return System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
這樣就足夠了么? 這樣是有問題的,HTTP_X_FORWARDED_FOR 、HTTP_VIA 是可以被冒名的。如果正好這里有SQL注入問題的話,那可非常嚴重了。
下面我們就來具體看HTTP_VIA 和HTTP_X_FORWARDED_FOR 這兩個 ServerVariables。
HTTP_VIA
如果有該條信息, 就證明您使用了代理服務器,代理服務器的地址就是后面的數值。
HTTP_X_FORWARDED_FOR
如果有該條信息, 也證明了您使用了代理服務器代理服務器的地址就是后面的數值。
需要注意的,HTTP_X_FORWARDED_FOR 的值,并不一定是只有一個IP地址,下面的信息也是可能的,每行一條記錄。下面數據取材于CSDN 實際的數據。
10.194.73.11
unknown, unknown, 211.100.22.30
203.98.182.163, 203.98.182.163, 203.129.72.215
172.16.20.110, 202.116.64.196, 203.81.21.61
10.194.75.83, 10.194.73.11, 10.194.73.11, unknown
192.168.120.57, unknown, unknown, 211.10.10.195
10.2.4.211, 219.141.250.3
3.242.165.168, 218.108.22.164
unknown, 211.100.22.30
192.168.83.56, 210.21.224.233
218.94.136.176, 203.81.21.61
unknown, 210.75.1.181
10.161.196.218, 202.104.134.23
222.216.6.148, 222.216.6.146
155.161.59.47, unknown
需要注意的是這兩個值都是可以被改掉的。
對于這三個值:REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR 來說,可以分以下五種情況:
一、沒有使用代理服務器的情況:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示