codetc - 网站开发技术 首页 代码 PHP 查看内容

PHP获取用户真实IP地址的方法

2016-8-8 15:37| 发布者: CODETC| 查看: 5551| 评论: 0

使用PHP获取客户端IP其实很简单,但如果你要获取到客户端真实的IP,那就不是简单的事了,甚至在某些情况下是根本不可能的事。因为客户端可能存在IP欺骗或者客户端使用了代理;如果用户使用了HTTP代理来访问的话,通过REMOTE_ADDR只能获取到HTTP代理的IP;这时你可能会说我们可以使用HTTP_X_FORWARDED_FOR来获取,确实没错,通过HTTP_X_FORWARDED_FOR基本是可以上拿到真实的IP,但如果只是这么简单的处理,必然会存在各种纰漏。一个比较常见的问题就是,如果用户通过多层HTTP代理来访问,那么每个代理都会把自己的IP加到X-FORWARDED-FOR这个头里面,另外,有些CDN或者其他类似代理的服务,会提供其他的HTTP头,比如 Cdn_Src_Ip,Proxy-Client-IP,WL-Proxy-Client-IP,Client-IP等等。


所以说要获取客户端真实的IP并不是一件简单的事,下面是几个比较常用的获取真实IP的方法,当然这几个方法也并不能保证100%获取到真实的IP。


function get_real_ip(){ 
	$ip=false; 
	if(!empty($_SERVER['HTTP_CLIENT_IP'])){ 
		$ip=$_SERVER['HTTP_CLIENT_IP']; 
	}
	if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
		$ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']); 
		if($ip){ array_unshift($ips, $ip); $ip=FALSE; }
		for ($i=0; $i < count($ips); $i++){
			if(!eregi ('^(10│172.16│192.168).', $ips[$i])){
				$ip=$ips[$i];
				break;
			}
		}
	}
	return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); 
}

function get_real_ip(){
    static $realip;
    if(isset($_SERVER)){
        if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
            $realip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }else if(isset($_SERVER['HTTP_CLIENT_IP'])){
            $realip=$_SERVER['HTTP_CLIENT_IP'];
        }else{
            $realip=$_SERVER['REMOTE_ADDR'];
        }
    }else{
        if(getenv('HTTP_X_FORWARDED_FOR')){
            $realip=getenv('HTTP_X_FORWARDED_FOR');
        }else if(getenv('HTTP_CLIENT_IP')){
            $realip=getenv('HTTP_CLIENT_IP');
        }else{
            $realip=getenv('REMOTE_ADDR');
        }
    }
    return $realip;
}

// 获取IP地址(摘自discuz)
function getIp(){
	$ip='未知IP';
	if(!empty($_SERVER['HTTP_CLIENT_IP'])){
		return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip;
	}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
		return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$ip;
	}else{
		return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip;
	}
}
function is_ip($str){
	$ip=explode('.',$str);
	for($i=0;$i255){  
			return false;  
		}  
	}  
	return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$str);  
}
文章来源 CODETC,欢迎分享,转载请注明地址: http://www.codetc.com/article-301-1.html

最新评论

 作为游客发表评论,请输入您的昵称

返回顶部