remote_addr = 您的 ip
http_via = 没数值或不显示
http_x_forwarded_for = 没数值或不显示
二、使用透明代理服务器的情况:transparent proxies
remote_addr = 最后一个代理服务器 ip
http_via = 代理服务器 ip
http_x_forwarded_for = 您的真实 ip ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:anonymous proxies
remote_addr = 最后一个代理服务器 ip
http_via = 代理服务器 ip
http_x_forwarded_for = 代理服务器 ip ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隐藏了您的真实ip,但是向访问对象透露了您是使用代理服务器访问他们的。
四、使用欺骗性代理服务器的情况:distorting proxies
remote_addr = 代理服务器 ip
http_via = 代理服务器 ip
http_x_forwarded_for = 随机的 ip ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机ip代替您的真实ip欺骗它。
五、使用高匿名代理服务器的情况:high anonymity proxies (elite proxies)
remote_addr = 代理服务器 ip
http_via = 没数值或不显示
http_x_forwarded_for = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
实例
/*** 获得用户的真实ip地址** @access public* @return string*/function real_ip(){// 初始化一个变量$realip static $realip = null; // 如果$realip不真等于null,返回之 if ($realip !== null) { return $realip; }// 如果$_server有值 if (isset($_server)) { // 如果$_server['http_x_forwarded_for']有值 // 表明客户端通过代理上网 if (isset($_server['http_x_forwarded_for'])) { // 使用explode()函数将其用','分割成数组 $arr = explode(',', $_server['http_x_forwarded_for']); /* 取x-forwarded-for中第一个非unknown的有效ip字符串 */ // 开始遍历数组 foreach ($arr as $ip) { // 去掉首尾的空白 $ip = trim($ip); // 不是unknown就是真实上网地址,存值并退出循环 if ($ip != 'unknown') { $realip = $ip; break; } } } // $_server['http_x_forwarded_for']无值 且 // $_server['http_client_ip']有值,取其值作为真实ip elseif (isset($_server['http_client_ip'])) { $realip = $_server['http_client_ip']; } // $_server['http_x_forwarded_for']无值(不是用过代理上网)并且 // $_server['http_client_ip']也没有值 else { // 如果$_server['remote_addr']有值,取其值作为真实ip if (isset($_server['remote_addr'])) { $realip = $_server['remote_addr']; } else // 都没有值返回'0.0.0.0' { $realip = '0.0.0.0'; } } } // $_server没有值 else { // 如果getenv('http_x_forwarded_for')非空取其值作为真实ip if (getenv('http_x_forwarded_for')) { $realip = getenv('http_x_forwarded_for'); } // 如果getenv('http_client_ip')非空取其值作为真实ip elseif (getenv('http_client_ip')) { $realip = getenv('http_client_ip'); } // 否则取getenv('remote_addr')的值作为真实ip else { $realip = getenv('remote_addr'); } } preg_match(/[d.]{7,15}/, $realip, $onlineip); // 此句干嘛用的?请高人指教一下。 $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0'; // 此句又是干嘛用的?请指教。 return $realip;}
最近在获取浏览客户端ip的功能的时候出现一个问题,主要的现象是这样的:一个在武汉使用北京电信的客户端的ip始终不能被我的程序访问,查了些资料修改了下,主要是对于c#获取ip的三种属性(http_x_forwarded_for,http_via,remote_addr)的区分分析如下:
一、没有使用代理服务器的情况:
remote_addr = 您的 ip
http_via = 没数值或不显示
http_x_forwarded_for = 没数值或不显示
二、使用透明代理服务器的情况:transparent proxies
remote_addr = 最后一个代理服务器 ip
http_via = 代理服务器 ip
http_x_forwarded_for = 您的真实 ip ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:anonymous proxies
remote_addr = 最后一个代理服务器 ip
http_via = 代理服务器 ip
http_x_forwarded_for = 代理服务器 ip ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隐藏了您的真实ip,但是向访问对象透露了您是使用代理服务器访问他们的。
四、使用欺骗性代理服务器的情况:distorting proxies
remote_addr = 代理服务器 ip
http_via = 代理服务器 ip
http_x_forwarded_for = 随机的 ip ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机ip代替您的真实ip欺骗它。
五、使用高匿名代理服务器的情况:high anonymity proxies (elite proxies)
remote_addr = 代理服务器 ip
http_via = 没数值或不显示
http_x_forwarded_for = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。
针对以上的属性分析将代码改为:
/// /// 获取客户端ip /// /// public string getuserip() { string _userip; try { if (httpcontext.current.request.servervariables[http_via] == null) { _userip = httpcontext.current.request.userhostaddress; } else { _userip = httpcontext.current.request.servervariables[remote_addr]; } } catch (exception) { _userip = 无法获取此ip; } return _userip; }
永久地址:
转载随意~请带上教程地址吧^^
