关于代理类型以及如何在各种代理情况下获得客户端IP

http 代理有几种类型?

透明代理(简单代理):透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了,例如Garden 2程序。
 
匿名代理。使用此种代理时,虽然被访问的网站不能知道你的IP地址,但仍然可以知道你在使用代理,有些侦测IP的网页也仍然可以查到你的IP。 

高度匿名代理:使用此种代理时,被访问的网站不知道你的IP地址,也不知道你在使用代理进行访问。此种代理的隐藏IP地址的功能最强。
如何获得用户IP?
http://hi.baidu.com/zs5460/item/4f6db3d0f76534bf33db9030

Request.ServerVariables变量意义.

 http代理相关知识 Request.ServerVariables["HTTP_VIA"]---------可以获得用户内部的ip Request.ServerVariables["HTTP_X_FORWARDED_FOR"]---------可以知道代理服务器的服务器名以及端口 Request.ServerVariables["REMOTE_ADDR"]-- 发出请求的远程主机的 IP 地址。

 http代理相关知识 关键就在HTTP_X_FORWARDED_FOR 使用不同种类代理服务器,上面的信息会有所不同:

 一、没有使用代理服务器的情况: 

REMOTE_ADDR = 您的 

IP HTTP_VIA = 没数值或不显示 

HTTP_X_FORWARDED_FOR = 没数值或不显示 

二、使用透明代理服务器的情况:Transparent Proxies 

REMOTE_ADDR = 代理服务器 IP 

HTTP_VIA = 代理服务器 IP 

HTTP_X_FORWARDED_FOR = 您的真实 IP 

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。 

三、使用普通匿名代理服务器的情况:Anonymous Proxies 

REMOTE_ADDR = 代理服务器 IP 

HTTP_VIA = 代理服务器 IP 

HTTP_X_FORWARDED_FOR = 代理服务器 IP 

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。 

四、使用欺骗性代理服务器的情况:Distorting Proxies 

REMOTE_ADDR = 代理服务器 IP 

HTTP_VIA = 代理服务器 IP 

HTTP_X_FORWARDED_FOR = 随机的 IP 告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。 

五、使用高匿名代理服务器的情况: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地址).呵.现实就是这样,某种东西都有有得必有失... 

猜你喜欢

转载自jiangwenfeng762.iteye.com/blog/1707451