再論 ASP.NET 中獲取客戶端IP地址


說到IP獲取無非是我們常見的以下幾種方式,但是具體獲取的值具體區別在哪?網上不乏相關文章,說的也是很詳細,但是真正使用起來,還有很多不太對的地方。IP在不同系統中,應用相當廣泛,常見的日志記錄、廣告分區域投放等。

   1:  HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
   2:  HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];                
   3:  HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
   4:  HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
   5:  HttpContext.Current.Request.UserHostAddress;

針對以上五項獲取IP的值其代表意思,Google一下后有人在博客中做了詳情說明,其中我找了一篇發布最早的,最原始是http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html拿來參考,有多好轉載這個的,然后加工了一下文章。在此我先引用一下該文章的內容便於閱讀。

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

      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欺騙它。

下面是我在真實測試結果

實驗代碼非常簡單

   1:  <%@ Page Language="C#" %>
   2:  <!DOCTYPE html>
   3:  <script runat="server">
   4:  protected override void OnLoad(EventArgs e)
   5:  {    
   6:      lblHTTP_VIA.Text="HTTP_VIA:"+HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
   7:      lblHTTP_X_FORWARDED_FOR.Text="HTTP_X_FORWARDED_FOR:"+HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];                
   8:      lblREMOTE_ADDR.Text = "REMOTE_ADDR:"+HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
   9:      lblHTTP_CLIENT_IP.Text="HTTP_CLIENT_IP:"+HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
  10:      lblUserHostAddress.Text="HttpContext.Current.Request.UserHostAddress:"+HttpContext.Current.Request.UserHostAddress;
  11:      base.OnLoad(e);
  12:  }
  13:  </script>
  14:  <head>
  15:      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  16:      <title></title>
  17:  </head>
  18:  <body>
  19:      <form id="form1" runat="server">
  20:          <asp:Label ID="lblREMOTE_ADDR" runat="server"></asp:Label><br />
  21:          <asp:Label ID="lblHTTP_VIA" runat="server"></asp:Label><br />
  22:          <asp:Label ID="lblHTTP_X_FORWARDED_FOR" runat="server"></asp:Label><br />
  23:          <asp:Label ID="lblHTTP_CLIENT_IP" runat="server"></asp:Label><br />
  24:          <asp:Label ID="lblUserHostAddress" runat="server"></asp:Label><br />
  25:      </form>
  26:  </body>
  27:  </html>

環境一 : 本地不使用代理;服務器網站不使用CDN加速;

結果一:getIP1

環境二 : 本地使用普通透明代理;服務器網站不使用CDN加速;

結果二:getIP2

 

環境三: 本地使用高度匿名代理;服務器網站不使用CDN加速;

結果三:getIP3

從結果二 和 結果三中證明:HTTP_VIA 的值並非代理IP,直接是空值(可見上述引用的文章描述至少不夠正確),那什么時候不為空呢?請接着往下看.

環境四: 本地不使用任何代理;服務器網站通過CDN加速;

結果四:getIP4

 

從結果四中看到:HTTP_VIA 終於不為空了,有個域名可以得出IP,證明了該值不確定性,由本人不太了解代理服務器架構,大致猜測出 這項值應該是代理服務器自己寫的值。

環境五:本地使用透明代理;服務器網站通過CDN加速;

結果五:getIP5

從環境五中 實際行成了一個 多層代理結果。這時如果通HTTP_X_FORWARDED_FOR獲取IP,需要分組 取一。

環境六:本地使用高度匿名代理;服務器網站通過CDN加速;

結果六:getIP6

到此總結 結論如下:

一、Request.ServerVariables["REMOTE_ADR"]:的值始終等於 Request.UserHostAddress。

二、Request.ServerVariables["HTTP_CLIENT_IP"]:的值始終等於空。

三、Request.ServerVariables["HTTP_VIA"]:的值就是CDN商。

四、Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:為代理IP,多層代理將有多個IP,最前面為原始IP。

好吧,所有結果說明一切。你需要簡單獲取IP,還是盡量獲取原始IP,就看你怎么取值了。這里我自己走了不少彎路,所以配個環境實測一下。 歡迎指正錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM