php获取真实ip地址原理及实现

看了很多其他网站关于php获取ip地址的php教程,都没给与下面三个变量的解释:

1、HTTP_X_FORWARDED_FOR 是用户到达最终访问地时经过的路径访问点(包括自身和使用的多层代理)的IP列表。依然取决于代理的设置,可通过http头伪造。在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。 
不过要注意的事,并不是每个代理服务器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的 IP。 

2、HTTP_CLIENT_IP 是代理服务器设置发送的HTTP头,代表你的客户端的真实IP。当然,人家可以选择设置与否以及设置成什么样。可通过http头伪造

3、REMOTE_ADDR比较好理解,php手册上有说明它是预定的变量,是你的客户端跟服务器“握手”时候的IP。如果使用代理,REMOTE_ADDR将显示代理服务器的IP。可能是用户真实IP也可能是代理IP

获取ip地址的两个方法:

1、超级全局变量$_SERVER['']

2、getenv()函数获取环境变量的值。(注意这个函数不支持IIS下的php)

<?php
function get_real_ip(){
   if(getenv("HTTP_CLIENT_IP")&& strcasecmp(getenv("HTTP_CLIENT_IP"),"unknow")){
      $ip = getenv("HTTP_CLIENT_IP");
   }elseif(getenv("HTTP_X_FORWARDED_FOR")&& strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),"unknow")){
      $ip = getenv("HTTP_X_FORWARDED_FOR");
   }elseif(getenv("REMOTE_ADDR")&& strcasecmp(getenv("REMOTE_ADDR"),"unknow")){
      $ip = getenv("REMOTE_ADDR");
   }elseif(isset($_SERVER["REMOTE_ADDR"])&& $_SERVER["REMOTE_ADDR"]&& strcasecmp($_SERVER["REMOTE_ADDR"],"unknow")){
      $ip = $_SERVER["REMOTE_ADDR"];
   }else{
      $ip ="unknow";
   }
   return $ip;
}
echo get_real_ip();
?>

 

你可能感兴趣的:(IP地址)