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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
php生成EAN_13标准条形码实例
Nov 13 PHP
php中apc缓存使用示例
Dec 25 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
php适配器模式简单应用示例
Oct 23 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 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
数据库中排序的对比及使用条件详解
2012/02/23 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
Python实现八大排序算法
2016/08/13 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
Python3远程监控程序的实现方法
2019/07/15 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
python numpy中cumsum的用法详解
2019/10/17 Python
Python 实现数组相减示例
2019/12/27 Python
PyTorch中permute的用法详解
2019/12/30 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
材料化学应届生求职信
2013/10/09 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
销售内勤岗位职责
2015/02/10 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书