PHP获取用户客户端真实IP的解决方案


Posted in PHP onOctober 10, 2016

获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,不能百分百准确.但是我们还是尽量找一个比较完善的获取客户端真正ip方法.使用php获取IP的方法能找到很多.

function getIp(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return($ip);

现在需要对这段代码进行解释,这里用到了两个函数,getenv()和strcasecmp(),前一个函数获取得系统的环境变量,如果能取到值,则返回该值,不能则返回false.

$_SERVER是服务器超级全局变量数组,用$_SERVER['REMOTE_ADDR']同样可以获取到客户端的IP地址.二者的区别在于,getenv不支持IIS的isapi方式运行的php.

strcasecmp(string1,string2)字符串函数的用法是把string1和string2进行比较,如果相等返回0,如果string1大于string2,返回大于0的数,小于则返回小于0的数.

函数先使用客户IP,如果不成立尝试用代理的方法,如果不行,再使用REMOTE_ADDR.

还看到过一个检测IP更详细的方法,考虑了IP的欺骗,和多重代理代码.方法相类似.

function getip() {
$unknown = 'unknown';
if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
$ip = $_SERVER['REMOTE_ADDR'];
}
/*
处理多层代理的情况
或者使用正则方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
*/
if (false !== strpos($ip, ','))
$ip = reset(explode(',', $ip));
return $ip;
}

一、没有使用代理服务器的PHP获取客户端IP情况:

REMOTE_ADDR = 客户端IP
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)

这类代理服务器还是将客户端真实的IP发送给了访问对象,无法达到隐藏真实身份的目的.

三、使用普通匿名代理服务器的PHP获取客户端IP情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)

这种情况下隐藏了客户端的真实IP,但是向访问对象透露了客户端是使用代理服务器访问它们的.

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)

这种情况下同样透露了客户端是使用了代理服务器,但编造了一个虚假的随机IP(220.4.251.159)代替客户端的真实IP来欺骗它.

五、使用高匿名代理服务器的PHP获取客户端IP情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 没数值或不显示

无论是REMOTE_ADDR还是HTTP_FORWARDED_FOR,这些头消息未必能够取得到,因为不同的浏览器不同的网络设备可能发送不同的IP头消息.因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值.

以上所述是小编给大家介绍的PHP获取用户客户端真实IP的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
多文件上传的例子
Oct 09 PHP
收集的php编写大型网站问题集
Mar 06 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
php批量删除操作代码分享
Feb 26 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
php判断电子邮件是否正确方法
Dec 04 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 #PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 #PHP
php中让人头疼的浮点数运算分析
Oct 10 #PHP
Laravel实现自定义错误输出内容的方法
Oct 10 #PHP
PHP定时任务获取微信access_token的方法
Oct 10 #PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 #PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
Oct 10 #PHP
You might like
php实现上传图片文件代码
2015/07/19 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
jquery创建一个ajax关键词数据搜索实现思路
2013/02/26 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
详解Python当中的字符串和编码
2015/04/25 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
django ManyToManyField多对多关系的实例详解
2019/08/09 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
导游实习生自荐书
2014/01/28 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
小学生感恩演讲稿
2014/04/25 职场文书
会员卡清退活动总结
2014/08/27 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js