利用HTTP_X_FORWARDED_FOR获取客户端IP(http代理的相关知识)

Request.ServerVariables变量意义. http代理相关知识
Request.ServerVariables["HTTP_VIA"]---------能够得到用户内部的ip
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]---------能够知道代理服务器的服务器名以及端口
Request.ServerVariables["REMOTE_ADDR"]-- 发出请求的远程主机的 IP 地址。
http代理相关知识
关键就在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
这类代理服务器仍是将您的信息转发给您的访问对象,没法达到隐藏真实身份的目的。
3、使用普通匿名代理服务器的状况:Anonymous Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
隐藏了您的真实IP,可是向访问对象透露了您是使用代理服务器访问他们的。
4、使用欺骗性代理服务器的状况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
5、使用高匿名代理服务器的状况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 
在WEB开发中.咱们可能都习惯使用下面的代码来获取客户端的IP地址:
 -----------------C#代码---------------------------------------------------------------------- 
//优先取得代理IP 
string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR" ]; 
if (string.IsNullOrEmpty(IP)) 
{
 
//没有代理IP则直接取链接客户端IP 

 IP = Request.ServerVariables["REMOTE_ADDR"]; 
}
 

----------------------------------------------------------------------------------------------- 

上面代码看来起是正常的.惋惜这里却隐藏了一个隐患!!由于"HTTP_X_FORWARDED_FOR"这个值是经过获取HTTP头的"X_FORWARDED_FOR"属性取得.因此这里就提供给恶意破坏者一个办法:能够伪造IP地址!! 

下面是测试代码: 
--------------C#代码--------------------------------------------------------------------------- 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/ip.aspx" ); 
request.Headers.Add(
"X_FORWARDED_FOR""0.0.0.0"
); 
HttpWebResponse response 
=
 (HttpWebResponse)request.GetResponse(); 
StreamReader stream 
= new
 StreamReader(response.GetResponseStream()); 
string IP =
 stream.ReadToEnd(); 
stream.Close(); 
response.Close(); 
request 
= null

----------------------------------------------------------------------------------------------- 
"ip.aspx"文件代码: 
------------C#代码----------------------------------------------------------------------------- 
Response.Clear(); 
//优先取得代理IP 

string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR" ]; 
if (string
.IsNullOrEmpty(IP))

  
//没有代理IP则直接取客户端IP 

  IP = Request.ServerVariables["REMOTE_ADDR"]; 
}
 
Response.Write(IP); 
Response.End(); 

------------------------------------------------------------------------------------------------ 
这样.当测试代码中去访问ip.aspx文件时."string IP = stream.ReadToEnd();"这段代码取到的IP数据就是"0.0.0.0"!!!!(呵.在真实状况下.这样的IP地址确定不是咱们想要的结果.而在有些投票系统中限制一个IP只能投1次票时,若是也是用相似的代码取得对方IP而后再判断的话.呵呵.限制就失效咯)... 

或者若是你用上面代码获取IP地址后后面又再也不进行数据判断的话也许还能更进一步进行数据破坏!!
好比你用相似上面的代码中获取IP地址就直接有这样的SQL语句:
 
string sql = "INSERT INTO (IP) VALUE ('" + IP + "')"; 那么也许破坏者还能够进行SQL注入进行数据破坏!! 这样看来利用"HTTP_X_FORWARDED_FOR"这个属性获取客户端IP的方法就再也不可取了.-_-# 但若是不用这种方法.那么那些真正使用了代理服务器的人.咱们又不能再获取到他们的真实IP地址(由于某些代理服务器会在"X_FORWARDED_FOR"这个HTTP头里加上访问用户真正的IP地址).呵.现实就是这样,某种东西都有有得必有失... 
相关文章
相关标签/搜索