客戶端ip:
Request.ServerVariables.Get("Remote_Addr").ToString();
客戶端主機名:
Request.ServerVariables.Get("Remote_Host").ToString();
客戶端瀏覽器IE:
Request.Browser.Browser;
客戶端瀏覽器 版本號:
Request.Browser.MajorVersion;//
客戶端操做系統:
Request.Browser.Platform;html
服務器ip:
Request.ServerVariables.Get("Local_Addr").ToString();
服務器名:
Request.ServerVariables.Get("Server_Name").ToString();瀏覽器
若是你想進一步瞭解ServerVariables,能夠用
foreach(String o in Request.ServerVariables){
Response.Write(o+"="+Request.ServerVariables[o]+"<br>");
}服務器
對於瞭解代理服務器狀況的人,咱們會知道,若是用戶使用了代理服務器,上述代碼得到的是代理服務器的IP地址;若是用戶使用了多個代理服務器,則是到達服務器的最後一個代理服務器的IP地址。post
REMOTE_ADDR 說明:測試
訪問客戶端的 IP 地址。
此項信息用戶不能夠修改。
若是真的給改了的話,你也和服務器鏈接不了了,服務器就是按照這個來與客戶端創建鏈接並進行通信的。實際我測試修改這個 ServerVariables , 一點效果都沒有。仍然得到是實際的值。
另: Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"] 實際是同一個值。ui
如何繞過代理服務器得到用戶真實的IP地址呢? 這時候咱們通常是相似以下的代碼(這裏我簡單起見,沒有做一些邊界判斷)spa
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];elsereturn System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];}
這樣就足夠了麼? 這樣是有問題的,HTTP_X_FORWARDED_FOR 、HTTP_VIA 是能夠被冒名的。若是正好這裏有SQL注入問題的話,那可很是嚴重了。操作系統
下面咱們就來具體看HTTP_VIA 和HTTP_X_FORWARDED_FOR 這兩個 ServerVariables。代理
HTTP_VIAorm
若是有該條信息, 就證實您使用了代理服務器,代理服務器的地址就是後面的數值。
HTTP_X_FORWARDED_FOR
若是有該條信息, 也證實了您使用了代理服務器代理服務器的地址就是後面的數值。
須要注意的,HTTP_X_FORWARDED_FOR 的值,並不必定是隻有一個IP地址,下面的信息也是可能的,每行一條記錄。下面數據取材於CSDN 實際的數據。
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
須要注意的是這兩個值都是能夠被改掉的。
對於這三個值:REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR 來講,能夠分如下五種狀況:
1、沒有使用代理服務器的狀況:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
2、使用透明代理服務器的狀況: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。
這類代理服務器仍是將您的信息轉發給您的訪問對象,沒法達到隱藏真實身份的目的。
3、使用普通匿名代理服務器的狀況: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,可是向訪問對象透露了您是使用代理服務器訪問他們的。
4、使用欺騙性代理服務器的狀況: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欺騙它。
5、使用高匿名代理服務器的狀況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
徹底用代理服務器的信息替代了您的全部信息,就象您就是徹底使用那臺代理服務器直接訪問對象。
下面是一個簡單的代碼,來演示冒名上述信息,博客的測試代碼。
服務器端的 UserIP.ASPX 頁面的代碼:
protected void Page_Load(object sender, EventArgs e){StringBuilder info = new StringBuilder();// 咱們關注的三個 ServerVariablesinfo.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 />");// 其餘有參考價值的 ServerVariablesforeach (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();}
客戶端發送請求的代碼:
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();}
測試的結果中的重要信息:
測試的結果數據比較多,我這裏只羅列了幾個重要的。
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 />
上面測試代碼須要注意的是:
咱們在客戶端代碼中設置了三個HTTP頭信息,分別是:
REMOTE_ADDR、VIA、X_FORWARDED_FOR
實際在服務器段,這三個值應該經過下面三個屬性來讀取
HTTP_REMOTE_ADDR、HTTP_VIA 、HTTP_X_FORWARDED_FOR 注意他們的區別!!
REMOTE_ADDR 屬性是沒法設置的。或者說,設置的不是咱們所但願的。
小結:
一、REMOTE_ADDR 不可被修改,可是可能會得到代理服務器的IP,而不是實際客戶端的IP。
二、經過 HTTP_VIA、HTTP_X_FORWARDED_FOR 咱們能夠得到代理服務器所代理的信息,可是這依靠代理服務器的支持。另外,這兩個值能夠被修改。咱們經過它得到的信息多是不真實的。另,HTTP_X_FORWARDED_FOR 的信息多是一個集合,不含 REMOTE_ADDR 中的代理服務器IP
posted @ 2010-01-15 11:32 kingwangzhen 閱讀(19) 評論(0) 編輯