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 相关文章推荐
第七节 类的静态成员 [7]
Oct 09 PHP
PHP 如何向 MySQL 发送数据
Oct 09 PHP
php Undefined index的问题
Jun 01 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
PHP设置一边执行一边输出结果的代码
Sep 30 PHP
php实现监听事件
Nov 06 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 PHP
详解PHP字符串替换str_replace()函数四种用法
Oct 13 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 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来实现网络服务
2009/09/15 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
python爬虫爬取幽默笑话网站
2019/10/24 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
计算机专业个人求职自荐信
2013/09/21 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
学习十八届三中全会精神实施方案
2014/02/17 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
读书演讲主持词
2014/03/18 职场文书
课外活动总结范文
2014/07/09 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
审美与表现自我评价
2015/03/09 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
董事长新年致辞
2015/07/29 职场文书
积极心理学课程心得体会
2016/01/22 职场文书