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 mysql数据库操作类
Jun 04 PHP
php5 pdo新改动加载注意事项
Sep 11 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
php实现评论回复删除功能
May 23 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 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/01 无线电
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
php使用PDO方法详解
2014/12/27 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
python制作小说爬虫实录
2017/08/14 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python实现用户名密码校验
2020/03/18 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
出生证明公证书
2014/04/09 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
个人合伙协议书范本
2014/10/14 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
党支部书记岗位职责
2015/02/15 职场文书
Python合并pdf文件的工具
2021/07/01 Python