伪造IP的失败尝试

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

原文地址:https://www.cnblogs.com/wzyl/p/2947037.html