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信息
文章图片
客户端ip
PHP获取ip信息
文章图片
客户端ip
  • ip带来的BUG:
PHP获取ip信息
文章图片
获取ip注意
PHP获取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一模一样。

【PHP获取ip信息】关于如何伪造ip,百度

    推荐阅读