PHP获取ip地址

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';
    }
}


转载于:https://my.oschina.net/731135090/blog/693139

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值