asp.net 獲取IP的相關(guān)資料
string user_IP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
對于了解代理服務(wù)器情況的人,我們會(huì)知道,如果用戶使用了代理服務(wù)器,上述代碼獲得的是代理服務(wù)器的IP地址;如果用戶使用了多個(gè)代理服務(wù)器,則是到達(dá)服務(wù)器的最后一個(gè)代理服務(wù)器的IP地址。
REMOTE_ADDR 說明:
訪問客戶端的 IP 地址。
此項(xiàng)信息用戶不可以修改。
如果真的給改了的話,你也和服務(wù)器連接不了了,服務(wù)器就是按照這個(gè)來與客戶端建立連接并進(jìn)行通訊的。實(shí)際我測試修改這個(gè) ServerVariables , 一點(diǎn)效果都沒有。仍然獲得是實(shí)際的值。
另: Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"] 實(shí)際是同一個(gè)值。
如何繞過代理服務(wù)器獲得用戶真實(shí)的IP地址呢? 這時(shí)候我們一般是類似如下的代碼(這里我簡單起見,沒有作一些邊界判斷)
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注入問題的話,那可非常嚴(yán)重了。
下面我們就來具體看HTTP_VIA 和HTTP_X_FORWARDED_FOR 這兩個(gè) ServerVariables。
HTTP_VIA
如果有該條信息, 就證明您使用了代理服務(wù)器,代理服務(wù)器的地址就是后面的數(shù)值。
HTTP_X_FORWARDED_FOR
如果有該條信息, 也證明了您使用了代理服務(wù)器代理服務(wù)器的地址就是后面的數(shù)值。
需要注意的,HTTP_X_FORWARDED_FOR 的值,并不一定是只有一個(gè)IP地址,下面的信息也是可能的,每行一條記錄。下面數(shù)據(jù)取材于CSDN 實(shí)際的數(shù)據(jù)。
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
需要注意的是這兩個(gè)值都是可以被改掉的。
對于這三個(gè)值:REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR 來說,可以分以下五種情況:
一、沒有使用代理服務(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欺騙它。
五、使用高匿名代理服務(wù)器的情況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服務(wù)器 IP
HTTP_VIA = 沒數(shù)值或不顯示
HTTP_X_FORWARDED_FOR = 沒數(shù)值或不顯示 ,經(jīng)過多個(gè)代理服務(wù)器時(shí),這個(gè)值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服務(wù)器的信息替代了您的所有信息,就象您就是完全使用那臺(tái)代理服務(wù)器直接訪問對象。
服務(wù)器端的 UserIP.ASPX 頁面的代碼:
protected void Page_Load(object sender, EventArgs e){
StringBuilder info = new StringBuilder(); // 我們關(guān)注的三個(gè) ServerVariables
info.AppendFormat("HTTP_VIA = {0} <br />\r\n",
Request.ServerVariables["HTTP_VIA"]);
info.AppendFormat("HTTP_X_FORWARDED_FOR = {0} <br />\r\n",
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]);
info.AppendFormat("REMOTE_ADDR = {0} <br />\r\n",
Request.ServerVariables["REMOTE_ADDR"]);
info.AppendLine("*********** \r\n<br />");
// 其他有參考價(jià)值的 ServerVariables
foreach (string key in Request.ServerVariables.AllKeys){
info.AppendFormat("{0} = {1} <br />\r\n", key, Request.ServerVariables[key]);
}
Response.Clear();
Response.Write(info.ToString());
Response.End();
}
客戶端發(fā)送請求的代碼:
[code]
static void Main(string[] args){
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:7867/MyTestWebSite/UserIP.aspx");
request.Headers.Add("REMOTE_ADDR", "192.168.5.88");
request.Headers.Add("VIA", "ghj1976");
request.Headers.Add("X_FORWARDED_FOR", "0.0.0.0");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader stream = new StreamReader(response.GetResponseStream());
string info = stream.ReadToEnd();
stream.Close();
response.Close();
request = null;
Console.Write(info);
Console.ReadLine();
}
測試的結(jié)果中的重要信息:測試的結(jié)果數(shù)據(jù)比較多,我這里只羅列了幾個(gè)重要的。
HTTP_VIA = ghj1976 <br />
HTTP_X_FORWARDED_FOR = 0.0.0.0 <br />
REMOTE_ADDR = 127.0.0.1 <br />
***********
REMOTE_ADDR = 127.0.0.1 <br />
HTTP_VIA = ghj1976 <br />
HTTP_REMOTE_ADDR = 192.168.5.88 <br />
HTTP_X_FORWARDED_FOR = 0.0.0.0 <br />
上面測試代碼需要注意的是:
我們在客戶端代碼中設(shè)置了三個(gè)HTTP頭信息,分別是:
REMOTE_ADDR、VIA、X_FORWARDED_FOR
實(shí)際在服務(wù)器段,這三個(gè)值應(yīng)該通過下面三個(gè)屬性來讀取
HTTP_REMOTE_ADDR、HTTP_VIA 、HTTP_X_FORWARDED_FOR 注意他們的區(qū)別!!
REMOTE_ADDR 屬性是無法設(shè)置的?;蛘哒f,設(shè)置的不是我們所希望的。
小結(jié):
1、REMOTE_ADDR 不可被修改,但是可能會(huì)獲得代理服務(wù)器的IP,而不是實(shí)際客戶端的IP。
2、通過 HTTP_VIA、HTTP_X_FORWARDED_FOR 我們可以獲得代理服務(wù)器所代理的信息,但是這依靠代理服務(wù)器的支持。另外,這兩個(gè)值可以被修改。我們通過它獲得的信息可能是不真實(shí)的。另,HTTP_X_FORWARDED_FOR 的信息可能是一個(gè)集合,不含 REMOTE_ADDR 中的代理服務(wù)器IP。
沒有一個(gè)完美的解決獲得客戶端IP地址的方法,我們只能在上面2個(gè)信息中取舍。
相關(guān)文章
Aspose.Cells 讀取受保護(hù)有密碼的Excel文件
這篇文章主要介紹了Aspose.Cells 讀取受保護(hù)有密碼的Excel文件,簡單實(shí)用,需要的朋友可以參考下。2016-06-06asp.net實(shí)現(xiàn)刪除DataGrid的記錄時(shí)彈出提示信息
這篇文章主要介紹了asp.net實(shí)現(xiàn)刪除DataGrid的記錄時(shí)彈出提示信息,非常實(shí)用的功能,需要的朋友可以參考下2014-08-08asp.net結(jié)合Ajax驗(yàn)證用戶名是否存在的代碼
關(guān)于Ajax的操作簡單總結(jié),結(jié)合Ajax驗(yàn)證用戶名是否存在的代碼2010-06-06深入.net調(diào)用webservice的總結(jié)分析
本篇文章是對.net調(diào)用webservice進(jìn)行了詳細(xì)的總結(jié)與分析,需要的朋友參考下2013-05-05.NET程序集引用COM組件MSScriptControl遇到問題的解決方法
這篇文章主要為大家詳細(xì)介紹了.NET程序集引用COM組件MSScriptControl遇到問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01ASP.NET Core中如何利用Csp標(biāo)頭對抗Xss攻擊
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何利用Csp標(biāo)頭對抗Xss攻擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09ASP.NET將文件寫到另一服務(wù)器(圖文教程)及注意事項(xiàng)
有時(shí)我們需要將來自于客戶端的文件上傳到WEB服務(wù)器端,并在服務(wù)端將文件存儲(chǔ)到第三方文件服務(wù)器中存儲(chǔ),既然有需求,那就有實(shí)現(xiàn)了,感興趣的你可以了解此文,或許對你學(xué)習(xí)asp.net 起到很好的作用哦2013-01-01asp.net下Oracle,SQL Server,Access萬能數(shù)據(jù)庫通用類
Oracle,SQL Server,Access萬能數(shù)據(jù)庫通用類!,使用asp.net開發(fā)多數(shù)據(jù)庫系統(tǒng)的朋友可以參考下。2010-10-10Asp.net后臺(tái)把腳本樣式輸出到head標(biāo)簽中節(jié)省代碼冗余
最近在學(xué)習(xí)開發(fā)服務(wù)器控件,其它就少不了為控件注冊js和css之類的資源文件,或者直接注冊純腳本樣式。其中就遇到如下問題 1、 注冊的資源文件或純腳本樣式在生成的頁面中都不在head標(biāo)簽中(當(dāng)然這個(gè)不影響頁面功能) 2、 一個(gè)頁面使用多個(gè)一樣的控件時(shí),會(huì)出現(xiàn)重復(fù)輸入(出現(xiàn)多余代碼)2013-02-02