PHP获取客户端真实IP地址的5种情况分析和实现代码


Posted in PHP onJuly 08, 2014

在PHP获取客户端IP中常使用 $_SERVER["REMOTE_ADDR"] 。
(1) 但如果客户端是使用代理服务器来访问,那取到的是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。
(2) 但只有客户端使用“透明代理”的情况下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客户端真正的IP(如果是多层代理,该值可能是由客户端真正IP和多个代理服务器的IP组成,由逗号“,”分隔)。
(3) 而在“匿名代理”、“欺骗性代理”的情况下是代理服务器的IP值(如果是多层代理,该值可能由多个代理服务器的IP组成,由逗号“,”分隔)。
(4) 在“高匿名代理”的情况下是空值。

关于HTTP头信息中的REMOTE_ADDR、HTTP_FORWARDED_FOR值,分析如下,假设客户端真实IP是221.5.252.160:

 一、没有使用代理服务器的PHP获取客户端IP情况:

REMOTE_ADDR = 221.5.252.160

HTTP_VIA=没数值或者不显示

HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP

HTTP_VIA=代理服务器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_VIA=代理服务器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_VIA=代理服务器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_VIA=没数值或者不显示

 HTTP_X_FORWARDED_FOR = 没数值或不显示。

无论是REMOTE_ADDR还是HTTP_FORWARDED_FOR,这些头消息未必能够取得到,因为不同的浏览器不同的网络设备可能发送不同的IP 头消息。因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。

PHP获取客户端IP时另外一点需注意,使用函数getenv('HTTP_X_FORWARDED_FOR')或getenv('REMOTE_ADDR') 也可以如上代码一样取得同样的效果。但getenv()不支持在IIS的isapi方式下运行的PHP。

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。

HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。

$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP

$_SERVER['HTTP_CLIENT_IP'];  //代理端的(有可能存在,可伪造)

$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

根据以上几种情况写出的PHP代码:

<?php

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'];  

 } 

}

?>
PHP 相关文章推荐
一个用php3编写的简单计数器
Oct 09 PHP
php 面向对象的一个例子
Apr 12 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
教你如何使用php session
Oct 28 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 PHP
phpstudy隐藏index.php的方法
Sep 21 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 #PHP
PHP生成短网址的3种方法代码实例
Jul 08 #PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 #PHP
php中函数前加&amp;符号的作用分解
Jul 08 #PHP
PHP实现的连贯操作、链式操作实例
Jul 08 #PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 #PHP
PHP的魔术常量__METHOD__简介
Jul 08 #PHP
You might like
基于mysql的论坛(7)
2006/10/09 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
PHP编程风格规范分享
2014/01/15 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
后勤岗位职责
2013/11/26 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
一年级学生期末评语
2014/04/21 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
Python函数式编程中itertools模块详解
2021/09/15 Python
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸