在我的一個系統中記錄到的訪客IP出現了10.0.0.1這樣的IP,印象中這是一個私有IP才對,於是對獲取IP的代碼又琢磨了一陣。
首先看下獲取IP的代碼
string userIP = string.Empty; if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] == null) { userIP = HttpContext.Current.Request.UserHostAddress; } else { userIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; }
Response.Write(userIP);
首先疑問ServerVariables集合是什么東西?W3C School解釋為:用於取回服務器變量值的集合。很奇怪,訪客IP這樣的信息為什么要保存在一個服務器變量集合中。
HttpWebRequest類可以自定義設置請求頭信息,我們嘗試修改這些信息,看是否能成功。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:4866/WebForm.aspx"); request.Headers.Add("X_FORWARDED_FOR", "0.0.0.0"); request.Headers.Add("HTTP_VIA", "0000");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader stream = new StreamReader(response.GetResponseStream(),Encoding.Default);
string IP = stream.ReadToEnd(); stream.Close(); response.Close();
request = null;
很不幸這種方式失敗了,得到的IP仍是本機IP。后來在網上看到有人嘗試用另外一種方式設置HTTP_VIA
request.Headers.Set(HttpRequestHeader.Via,"00000");
可能Add是自定義頭信息用的,Set是系統頭信息使用的吧。這樣改后輸出IP為0.0.0.0。如此,網上限制IP的系統豈不是都簡單破解?
為了能證明自己,把URL換成ip138(http://iframe.ip138.com/ic.asp)測試,結果返回的仍是真實IP。
初步推斷,HTTP_VIA這個頭信息經過一次網絡轉發后會改變一次,因為我本機測試所以會出現0.0.0.0的情況。
所以上面判斷訪客IP的代碼應該是正確的,那系統里的10.0.0.1是怎么出現的呢?