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 相关文章推荐
BBS(php & mysql)完整版(四)
Oct 09 PHP
PHP form 表单传参明细研究
Jul 17 PHP
PHP中其实也可以用方法链
Nov 10 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 PHP
PHP获取一个字符串中间一部分字符的方法
Aug 19 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php将字符串随机分割成不同长度数组的方法
Jun 01 PHP
PHP执行linux命令常用函数汇总
Feb 02 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 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
咖啡知识大全
2021/03/03 新手入门
在线竞拍系统的PHP实现框架(一)
2006/10/09 PHP
php中的登陆login
2007/01/18 PHP
php中计算时间差的几种方法
2009/12/31 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
PHP静态文件生成类实例
2014/11/29 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
Python多项式回归的实现方法
2019/03/11 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
Python pip 常用命令汇总
2020/10/19 Python
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
农行实习自我鉴定
2013/09/22 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
创业计划书如何编写
2014/02/06 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2014年营业员工作总结
2014/11/18 职场文书
考研导师推荐信范文
2015/03/27 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技