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 相关文章推荐
PHP获取http请求的头信息实现步骤
Dec 16 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php验证码生成代码
Nov 11 PHP
Yii2 assets清除缓存的方法
May 16 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
PHP递归的三种常用方式
Feb 28 PHP
基于laravel belongsTo使用详解
Oct 18 PHP
Yii框架应用组件用法实例分析
May 15 PHP
深入分析PHP设计模式
Jun 15 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
一周学会PHP(视频)Http下载
2006/12/12 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
php遍历CSV类实例
2015/04/14 PHP
Yii快速入门经典教程
2015/12/28 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
分享一则javascript 调试技巧
2015/01/02 Javascript
jquery增加和删除元素的方法
2015/01/14 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
火车票抢票python代码公开揭秘!
2018/03/08 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
工作表现评语
2014/01/19 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
酒店总经理职务说明书
2014/02/26 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis