IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    PHP获取ip地址

    summer发表于 2016-06-16 13:56:07
    love 0

    1.’REMOTE_ADDR’ 是远端IP,默认来自tcp 连接是,客户端的Ip。也就是直接连服务器的客户端IP。如果对方通过代理服务器上网,获取到的是代理服务器的IP了。例如:c->proxy->s;
    如果我们使用了nginx之类的反向代理服务器,我们获取的就是nginx代理服务器的ip。例如:c->nginx->s

    2.’HTTP_X_FORWARDED_FOR’的格式:HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 为了能在复杂的网络中获取到最接近用户的IP(有可能是代理IP地址)。在通过了HTTP 代理或者负载均衡服务器时会添加该项,通过一次,就会加上一个的ip。当然用户可以伪造该项的第一个;
    例如 u(192.168.1.1)->proxy1(192.168.1.2)->proxy2(192.168.1.3)->nginx(192.168.1.5)->s ,则X-Forwarded-For: 192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4
    但是后面的ip是代理服务器或者nginx反向代理服务器加上的ip,后面的ip是伪造不了的;
    获取的HTTP_X_FORWARDED_FOR 前面的地址都有可能是用户伪造的,最后一个是伪造不了的。所以我们可以从后面往前取第一个不在我们ip数组中的地址。

    ```

    /**
    * 获取用户IP
    * @param type allowProxys(我们负载均衡服务器ip)
    * @return string
    */
    function get_client_ip(allowProxys = array())
    {
    if (getenv('REMOTE_ADDR'))
    {
    onlineip = getenv('REMOTE_ADDR');
    }
    else
    {
    onlineip = _SERVER['REMOTE_ADDR'];
    }
    if (in_array(onlineip, allowProxys))
    {
    if (getenv('HTTP_X_FORWARDED_FOR'))
    {
    ips = getenv('HTTP_X_FORWARDED_FOR');
    }
    else if (_SERVER['HTTP_X_FORWARDED_FOR'])
    {
    ips = _SERVER['HTTP_X_FORWARDED_FOR'];
    }
    if (ips)
    {
    ips = explode(",", ips);
    count = count(ips);
    for(i = count-1 ;i < count; i--)
    {
    if (in_array(ips[i], allowProxys))
    {
    array_pop(ips);
    }
    else
    {
    break;
    }
    }

    curIP = array_pop(ips);
    onlineip = trim(curIP);
    }
    }
    if (filter_var(onlineip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
    {
    return onlineip;
    }
    else
    {
    return '0.0.0.0';
    }
    }

    ```



沪ICP备19023445号-2号
友情链接