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加速;
結果一:
環境二 : 本地使用普通透明代理;服務器網站不使用CDN加速;
結果二:
環境三: 本地使用高度匿名代理;服務器網站不使用CDN加速;
結果三:
從結果二 和 結果三中證明:HTTP_VIA 的值并非代理IP,直接是空值(可見上述引用的文章描述至少不夠正確),那什么時候不為空呢?請接著往下看.
環境四: 本地不使用任何代理;服務器網站通過CDN加速;
結果四:
從結果四中看到:HTTP_VIA 終于不為空了,有個域名可以得出IP,證明了該值不確定性,由本人不太了解代理服務器架構,大致猜測出 這項值應該是代理服務器自己寫的值。
環境五:本地使用透明代理;服務器網站通過CDN加速;
結果五:
從環境五中 實際行成了一個 多層代理結果。這時如果通HTTP_X_FORWARDED_FOR獲取IP,需要分組 取一。
環境六:本地使用高度匿名代理;服務器網站通過CDN加速;
結果六:
到此總結 結論如下:
一、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,就看你怎么取值了。這里我自己走了不少彎路,所以配個環境實測一下。 歡迎指正錯誤。
廣告: