获取用户IP地址的三个属性的区别及CakePHP之获取IP方法

想要获取ip并不难,但是要获取准确的ip的确是值得探索的问题.
在使用代理,透明代理,匿名代理以及欺骗性代理服务器等等情况下,在获取客户端IP的时候,需要做相应的判断:

一、无代理服务器:

      REMOTE_ADDR = 您的 IP
      HTTP_VIA = 没数值或不显示
      HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器:Transparent Proxies
   透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP.例如Garden 2程序.

      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
    使用此种代理时,可以知道你在使用代理,有些侦测IP的网页也仍然可以查到你的IP:

      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)
    使用此种代理时,被访问的网站不知道你的IP地址,也不知道你在使用代理进行访问.此种代理的隐藏IP地址的功能最强.

      REMOTE_ADDR = 代理服务器 IP
      HTTP_VIA = 没数值或不显示
      HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

在PHP中获取IP的方法有:
1.简单的

$ip = ($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_FOR"]:$_SERVER["REMOTE_ADDR"];
$ip = $ip?$ip:$_SERVER["REMOTE_ADDR"];


2.复杂点的
//php获取ip的算法
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){

	$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];

}elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]){

	$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];

}elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]){

	$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];

}elseif (getenv("HTTP_X_FORWARDED_FOR")){

	$ip = getenv("HTTP_X_FORWARDED_FOR");

}elseif (getenv("HTTP_CLIENT_IP")){

	$ip = getenv("HTTP_CLIENT_IP");

}elseif (getenv("REMOTE_ADDR")){

	$ip = getenv("REMOTE_ADDR");

}else{

	$ip = "Unknown";

}


在CakePHP中,如果加载了RequestHandler组件,则其中的getClientIP方法可以用来获取客户端IP:

$this->RequestHandler->getClientIP();


RequestHandler中源码:

	function getClientIP($safe = true) {
		if (!$safe && env('HTTP_X_FORWARDED_FOR') != null) {
			$ipaddr = preg_replace('/(?:,.*)/', '', env('HTTP_X_FORWARDED_FOR'));
		} else {
			if (env('HTTP_CLIENT_IP') != null) {
				$ipaddr = env('HTTP_CLIENT_IP');
			} else {
				$ipaddr = env('REMOTE_ADDR');
			}
		}

		if (env('HTTP_CLIENTADDRESS') != null) {
			$tmpipaddr = env('HTTP_CLIENTADDRESS');

			if (!empty($tmpipaddr)) {
				$ipaddr = preg_replace('/(?:,.*)/', '', $tmpipaddr);
			}
		}
		return trim($ipaddr);
	}


非常简单.

你可能感兴趣的:(PHP,算法,cakephp)