获取真实IP的几种方式

来源:互联网 发布:淘宝评价时间是多久 编辑:程序博客网 时间:2024/05/22 17:21

一些基础知识的补充


根据不同的访问情况,PHP提供几个不同的环境变量用于获取客户端IP:

  • REMOTE_ADDR
  • HTTP_VIA
  • 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 ,经过多个代理服务器时,这个值类似如下: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。

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


——————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————

具体实现的代码

第一种方法

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地址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;$i<count($ip);$i++){  if($ip[$i]>255){  return false;  }  }  return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$str);  }


最后附上一个获取服务器IP地址

/*** 获取服务器端IP地址 * @return string */function get_server_ip() {     if (isset($_SERVER)) {         if($_SERVER['SERVER_ADDR']) {            $server_ip = $_SERVER['SERVER_ADDR'];         } else {             $server_ip = $_SERVER['LOCAL_ADDR'];         }     } else {         $server_ip = getenv('SERVER_ADDR');    }     return $server_ip; 


0 0
原创粉丝点击