獲取客戶的IP地址

 


通常我們都通過下面的代碼獲得IP:
   string ip =System.Web.HttpContext.Current.Request.UserHostAddress;
    或 string ip =System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

REMOTE_ADDR 說明:

訪問客戶端的 IP 地址。
此項信息用戶不可以修改。
如果真的給改了的話,你也和服務器連接不了了,服務器就是按照這個來與客戶端建立連接並進行通訊的。實際我測試修改這個 ServerVariables , 一點效果都沒有。仍然獲得是實際的值。

但如果用戶使用了代理服務器,上述代碼獲得的是代理服務器的IP地址;如果用戶使用了多個代理服務器,則是到達服務器的最後一個代理服務器的IP地址。

如何繞過代理服務器獲得用戶真實的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"];
 }


Request.ServerVariables["HTTP_VIA"] ,ServerVariables["HTTP_X_FORWARDED_FOR"],Request.ServerVariables["REMOTE_ADDR"]的值分下面幾種情況:

一、沒有使用代理服務器的情況:

      REMOTE_ADDR = 用戶的 IP
      HTTP_VIA = 沒數值或不顯示
      HTTP_X_FORWARDED_FOR = 沒數值或不顯示

二、使用透明代理服務器的情況:Transparent Proxies

      REMOTE_ADDR = 最後一個代理服務器 IP
      HTTP_VIA = 代理服務器 IP
      HTTP_X_FORWARDED_FOR = 用戶的真實 IP ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   這類代理服務器還是將您的信息轉發給您的訪問對象,無法達到隱藏真實身份的目的。


三、使用普通匿名代理服務器的情況:Anonymous Proxies

      REMOTE_ADDR = 最後一個代理服務器 IP
      HTTP_VIA = 代理服務器 IP
      HTTP_X_FORWARDED_FOR = 代理服務器 IP ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   隱藏了您的真實IP,但是向訪問對象透露了您是使用代理服務器訪問他們的。

四、使用欺騙性代理服務器的情況:Distorting Proxies

      REMOTE_ADDR = 代理服務器 IP
      HTTP_VIA = 代理服務器 IP
      HTTP_X_FORWARDED_FOR = 隨機的 IP ,經過多個代理服務器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   告訴了訪問對象您使用了代理服務器,但編造了一個虛假的隨機IP代替您的真實IP欺騙它。

所以getIp()也不是最好的,因爲可以編造一個假的IP,具體做法去看http://www.cnblogs.com/kingthy/archive/2007/11/24/970783.html

總結:
"Request.UserHostAddress"是可信的.但是這樣的話卻又獲取不了那些已使用了代理服務器的用戶真實IP地址(因爲在這時Request.UserHostAddress獲取到的就是這代理服務器的IP)..
getIp()又有安全隱患
具體怎麼做就要看自己選擇了.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章