在我的一个系统中记录到的访客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是怎么出现的呢?