php $_SERVER[‘‘REMOTE_ADDR‘] 获取IP并不真实

4 篇文章 0 订阅
3 篇文章 0 订阅

php $_SERVER[’‘REMOTE_ADDR’] 获取IP并不真实

bug 出现

最近有个小项目投票上线了,结果发现投票没多久就出现投票不成功的错误(IP限制数超越错误)!

bug 跟踪

连上服务器的数据库一看,发现数据库IP记录清一色是167863555(ip转int后),这地址是服务器内网的IP,很可能就是服务器的代理IP。翻看Controller,发现IP获取是$ip = S E R V E R [ ′ R E M O T E A D D R ′ ] ; 咋 看 这 代 码 似 乎 问 题 不 大 , 本 地 测 试 时 候 I P 获 取 也 正 常 , 但 生 产 环 境 却 大 有 不 同 , 第 一 使 用 了 反 向 代 理 ( n g i n x 等 ) , 用 户 也 可 能 使 用 代 理 , 因 此 单 纯 的 _SERVER['REMOTE_ADDR']; 咋看这代码似乎问题不大,本地测试时候IP获取也正常,但生产环境却大有不同,第一使用了反向代理(nginx等),用户也可能使用代理,因此单纯的 SERVER[REMOTEADDR];IP使(nginx)使_SERVER[‘REMOTE_ADDR’]并不能感知用户真实IP

bug 解决

解决办法是使用以下函数,基本能拿到用户真实IP

    //获取用户IP地址
    public function getIp()
    {
    
    	if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    	{
    		$cip = $_SERVER["HTTP_CLIENT_IP"];
    	}
    	else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    	{
    		$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    	}
    	else if(!empty($_SERVER["REMOTE_ADDR"]))
    	{
    		$cip = $_SERVER["REMOTE_ADDR"];
    	}
    	else
    	{
    		$cip = '';
    	}
    	preg_match("/[\d\.]{7,15}/", $cip, $cips);
    	$cip = isset($cips[0]) ? $cips[0] : 'unknown';
    	unset($cips);
    
    	return $cip;
    }

更多原创php技术贴,欢迎浏览BKDUCK博客[www.bkduck.cn/][1]
[1]: https://www.bkduck.cn/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值