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 相关文章推荐
php简单的会话类代码
Aug 08 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
PHP资源管理框架Assetic简介
Jun 12 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
php的socket编程详解
Nov 20 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
Jan 17 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获取网络上文件
2006/10/09 PHP
php实现jQuery扩展函数
2009/10/30 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
python字典基本操作实例分析
2015/07/11 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
师范应届生教师求职信
2013/11/05 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
商品陈列协议书
2014/09/29 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang