【Api】PHP获取客户端ip信息及Api接口

作者: Timeless 更新时间: 阅读量: 35

一、PHP获取客户端IP地址

php获取客户端IP,很多代码都会拿 HTTP_CLIENT_IP的值,其次拿 HTTP_X_FORWARDED_FOR,最后是 REMOTE_ADDR。但是因为代理、curl、ip伪造什么的存在,我也没有实际去测试过很多,所以只是收集方法,方便以后使用~

1.1客户端没有使用代理服务器

  REMOTE_ADDR = 客户端IP,严格意义上说它是你的客户端跟你的服务器“握手”时候的IP

  $ip = $_SERVER['REMOTE_ADDR'];

 1.2、客户端使用透明代理

  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 客户端真实 IP

  这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。

  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

1.3、使用普通匿名代理服务器

  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 代理服务器 IP

  这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。

1.4、使用欺骗性代理服务器

  REMOTE_ADDR = 代理服务器 IP
  HTTP_X_FORWARDED_FOR = 随机的 IP

  服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假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']);
}

2.1、SegmentFault上的

function get_client_ip(){
    foreach (array(
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR'
    ) as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);//会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤
                //也可以修改成正则验证IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP,
                    FILTER_FLAG_IPV4 |
                    FILTER_FLAG_NO_PRIV_RANGE |
                    FILTER_FLAG_NO_RES_RANGE)) {return $ip;
                }
            }
        }
    }
    return null;
}

三、获取客户端IP信息接口

新浪IP接口: http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json

                      https://pv.sohu.com/cityjson?ie=utf-8

淘宝IP接口: http://ip.taobao.com/service/getIpInfo.php?ip=

我的IP接口   //cos.timelessq.com/api/ip.php

GET或者POST都可以,不发送参数、或者参数 type为1时,只返回客户端ip地址。 like this:  https://cos.timelessq.com/api/ip.php 或者 https://cos.timelessq.com/api/ip.php?type=1

参数 type为2 时 返回 客户端ip地址 所在城市等信息  https://cos.timelessq.com/api/ip.php?type=2

QQ截图20180606150252.png

以下是源码:

<?php
    header("Content-Type:text/html;charset=UTF-8");
    /** 
     * php获取客户端真实 IP 
     */  
    function getIP()  
    {  
        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;  
    }  
    /** 
     * php获取 IP 详细信息
     * 新浪IP接口 http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json
     * 淘宝IP接口 http://ip.taobao.com/service/getIpInfo.php?ip=
     * @Return: array 
     */  
    function getInfo($ip)  
    {  
        if($ip == ''){  
            $url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json";  
            $ip=json_decode(file_get_contents($url),true);  
            $data = $ip;  
            $data['region'] = $data['province'];
        }else{  
            $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;  
            $ip=json_decode(file_get_contents($url));  
            if((string)$ip->code=='1'){  
                return false;  
            }  
            $data = (array)$ip->data;  
        }  
        return array($data['country'],$data['region'],$data['city'],$data['isp']);  
    }
	
    $ip = getIP();
    $para = isset($_GET['type']) ? $_GET['type'] : '';
    if($para==""||$para==1){
        $res = array("ip"=>$ip);
        echo json_encode($res);
    }else{
        $info = getinfo($ip);
        $res = array("ip"=>$ip,"country"=>$info[0],"region"=>$info[1],"city"=>$info[2],"isp"=>$info[3]);
        echo json_encode($res,JSON_UNESCAPED_UNICODE);
    }
?>