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 图片上传类代码
Jul 17 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
迁移PHP版本到PHP7
Feb 06 PHP
yii用户注册表单验证实例
Dec 26 PHP
PHP发送AT指令实例代码
May 26 PHP
php微信支付接口开发程序
Aug 02 PHP
PHP面向对象学习之parent::关键字
Jan 18 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
Laravel 实现密码重置功能
Feb 23 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
保密工作责任书
2014/04/16 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
申报优秀教师材料
2014/12/16 职场文书
横店影视城导游词
2015/02/06 职场文书
工程催款通知书
2015/04/17 职场文书
2016十一国庆节感言
2015/12/09 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
Go语言设计模式之结构型模式
2021/06/22 Golang
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android