ASP.NET 中獲取客戶端IP地址
說到IP獲取無非是我們常見的以下幾種方式,但是具體獲取的值具體區(qū)別在哪?網(wǎng)上不乏相關(guān)文章,說的也是很詳細(xì),但是真正使用起來,還有很多不太對的地方。IP在不同系統(tǒng)中,應(yīng)用相當(dāng)廣泛,常見的日志記錄、廣告分區(qū)域投放等。
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;
針對以上五項(xiàng)獲取IP的值其代表意思,Google一下后有人在博客中做了詳情說明,其中我找了一篇發(fā)布最早的,最原始是http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html拿來參考,有多好轉(zhuǎn)載這個(gè)的,然后加工了一下文章。在此我先引用一下該文章的內(nèi)容便于閱讀。
一、沒有使用代理服務(wù)器的情況:
REMOTE_ADDR = 用戶的 IP
HTTP_VIA = 沒數(shù)值或不顯示
HTTP_X_FORWARDED_FOR = 沒數(shù)值或不顯示
二、使用透明代理服務(wù)器的情況:Transparent Proxies
REMOTE_ADDR = 最后一個(gè)代理服務(wù)器 IP
HTTP_VIA = 代理服務(wù)器 IP
HTTP_X_FORWARDED_FOR = 用戶的真實(shí) IP ,經(jīng)過多個(gè)代理服務(wù)器時(shí),這個(gè)值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
這類代理服務(wù)器還是將您的信息轉(zhuǎn)發(fā)給您的訪問對象,無法達(dá)到隱藏真實(shí)身份的目的。
三、使用普通匿名代理服務(wù)器的情況:Anonymous Proxies
REMOTE_ADDR = 最后一個(gè)代理服務(wù)器 IP
HTTP_VIA = 代理服務(wù)器 IP
HTTP_X_FORWARDED_FOR = 代理服務(wù)器 IP ,經(jīng)過多個(gè)代理服務(wù)器時(shí),這個(gè)值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隱藏了您的真實(shí)IP,但是向訪問對象透露了您是使用代理服務(wù)器訪問他們的。
四、使用欺騙性代理服務(wù)器的情況:Distorting Proxies
REMOTE_ADDR = 代理服務(wù)器 IP
HTTP_VIA = 代理服務(wù)器 IP
HTTP_X_FORWARDED_FOR = 隨機(jī)的 IP ,經(jīng)過多個(gè)代理服務(wù)器時(shí),這個(gè)值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告訴了訪問對象您使用了代理服務(wù)器,但編造了一個(gè)虛假的隨機(jī)IP代替您的真實(shí)IP欺騙它。
下面是我在真實(shí)測試結(jié)果
實(shí)驗(yàn)代碼非常簡單
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>
環(huán)境一 : 本地不使用代理;服務(wù)器網(wǎng)站不使用CDN加速;
結(jié)果一:
環(huán)境二 : 本地使用普通透明代理;服務(wù)器網(wǎng)站不使用CDN加速;
結(jié)果二:
環(huán)境三: 本地使用高度匿名代理;服務(wù)器網(wǎng)站不使用CDN加速;
結(jié)果三:
從結(jié)果二 和 結(jié)果三中證明:HTTP_VIA 的值并非代理IP,直接是空值(可見上述引用的文章描述至少不夠正確),那什么時(shí)候不為空呢?請接著往下看.
環(huán)境四: 本地不使用任何代理;服務(wù)器網(wǎng)站通過CDN加速;
結(jié)果四:
從結(jié)果四中看到:HTTP_VIA 終于不為空了,有個(gè)域名可以得出IP,證明了該值不確定性,由本人不太了解代理服務(wù)器架構(gòu),大致猜測出 這項(xiàng)值應(yīng)該是代理服務(wù)器自己寫的值。
環(huán)境五:本地使用透明代理;服務(wù)器網(wǎng)站通過CDN加速;
結(jié)果五:
從環(huán)境五中 實(shí)際行成了一個(gè) 多層代理結(jié)果。這時(shí)如果通HTTP_X_FORWARDED_FOR獲取IP,需要分組 取一。
環(huán)境六:本地使用高度匿名代理;服務(wù)器網(wǎng)站通過CDN加速;
結(jié)果六:
到此總結(jié) 結(jié)論如下:
一、Request.ServerVariables["REMOTE_ADR"]:的值始終等于 Request.UserHostAddress。
二、Request.ServerVariables["HTTP_CLIENT_IP"]:的值始終等于空。
三、Request.ServerVariables["HTTP_VIA"]:的值就是CDN商。
四、Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:為代理IP,多層代理將有多個(gè)IP,最前面為原始IP。
好吧,所有結(jié)果說明一切。你需要簡單獲取IP,還是盡量獲取原始IP,就看你怎么取值了。這里我自己走了不少彎路,所以配個(gè)環(huán)境實(shí)測一下。 歡迎指正錯(cuò)誤。