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/
今天的文章php引用另一个php_php获取客户端ip分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59239.html