PHP获取ip信息

  • php的ip信息来源是在 $_SERVER(超全局变量中):
    'HTTP_X_FORWARDED_FOR''HTTP_CLIENT_IP''REMOTE_ADDR'

  • REMOTE_ADDR:获取客户端ip地址;(如果客户端使用代理服务器,获取最后一个代理服务器ip地址)(该ip是不容易伪造的)

  • HTTP_CLIENT_IP:代理服务器发送的HTTP头。(可能被修改)

  • HTTP_X_FORWARDED_FOR:代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。(容易被修改)

    • HTTP_X_FORWARDED_FOR 和 HTTP_CLIENT_IP:都是通过HTTP头的形式的获取ip信息,就很可能被用户进行修改。
    • REMOTE_ADDR:是及时生成的,不容易被修改。

PHP获取ip信息_第1张图片
客户端ip

PHP获取ip信息_第2张图片
客户端ip

  • ip带来的BUG
PHP获取ip信息_第3张图片
获取ip注意

ip限制注意

我们需要考虑的是:代理服务的可能是正常访问的用户;也可能是恶意修改ip地址破坏的用户。


  • php获取客户端ip代码
 /** 
  * 获取客户端IP地址 
  * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 
  * @return mixed 
  */
function get_client_ip($type = 0) {
     //> 相当于intval函数,对用户输入进行一次过滤
     $type       =  $type ? 1 : 0;  //> 参数设计0 | 1为后面返回ip准备
     //> 采用静态变量,保存本次HTTP请求不再去获取相同的ip
     static $ip  =   NULL;
     if ($ip !== NULL) return $ip[$type]; 
     //> 判断用户是否通过代理服务器访问(用户可能伪造ip地址)
     if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
         //> 正确的代理是通过逗号分隔的字符串 explode分隔字符串成数组
         $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 
         //> 搜索'unknown'是否在$arr中(值搜索),如果存在返回对应的键;否则返回false(unknown可能是一些系统原因造成的)
         $pos    =   array_search('unknown',$arr); 
         if(false !== $pos) unset($arr[$pos]); 
         //> 去除字符串开始和结尾的空格或其他。
         $ip     =   trim($arr[0]); 
     }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { 
         $ip     =   $_SERVER['HTTP_CLIENT_IP']; 
     }elseif (isset($_SERVER['REMOTE_ADDR'])) {  
        $ip     =   $_SERVER['REMOTE_ADDR']; 
     }    
     // IP地址合法验证 
     $long = sprintf("%u",ip2long($ip));  //> sprintf():格式化指定的变量
     $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0); 
     return $ip[$type];
}
//>------------------------------------ 函数详解 --------------------------------------
//> explode :使用分隔符分隔字符串,返回数组
//> 分隔限制数量:正数 则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。 
//> 负数:则返回除了最后的 -limit 个元素外的所有元素。
//> 0:当做 1 处理
array explode( '分隔符', '分隔字符串' [, '分隔限制数量'] );
> ------------------------------------------------------------------------------------------------
//> 在数组中搜索给定的值,如果成功则返回相应的键名; 否则返回 false(array_search函数定义)
mixed array_search(mixed $needle, array $haystack [, bool $strict = false])
>> $neddle //> 需要搜索的值
>> $haystack //> 在当前数组中搜索
>> $strict //> 是否采用严格搜索;默认 false (不比较数据类型)。
  • trim()ltrim()rtrim():去掉指定的字符
trim( $str [, $exp] ):去掉首位相应的$exp字符,返回处理后的字符串(如果没有$exp,采用默认值;参看手册)
ltrim( $str [, $exp] ):去掉开始相应的字符。用法和trim一模一样。
rtrim( $str [, $exp] ):去掉尾部相应的字符。用法和trim一模一样。

关于如何伪造ip,百度

你可能感兴趣的:(PHP获取ip信息)