深入分析几种PHP获取客户端IP的情况
http://mount.blog.51cto.com/764124/528084

2011-03-27 16:13:29

标签:代理服务器 客户端 文章

PHP获与客户端IP的情况分为:没有使用代理服务器的情况、使用透明代理服务器的情况、使用匿名代理服务器的情况、使用诈骗性代理服务器的情况、使用高匿名代理服务器的情况 。

在这篇文章中,我们将会为大家详细介绍PHP获取客户端IP的几种情况分析。我们在使用PHP获取的IP可能是客户端真实的IP,也可能是代理服务器的IP,也有可能根本取不到任何IP值。

  • 经验分享 总结PHP常用函数
  • 一劳永逸 打造简单PHP分页函数
  • 方便快捷的PHP长文章分页函数
  • 探讨PHP分页导航函数的具体应用
  • 为你解读PHP realpath路径函数

    在PHP获取客户端IP中常使用 $_SERVER["REMOTE_ADDR"] 。但如果客户端是使用代理服务器来访问,那取到的是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

    但只有客户端使用“透明代理”的情况下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客户端真正的IP(如果是多层代理,该值可能是由客户端真正IP和多个代理服务器的IP组成,由逗号“,”分隔),而在“匿名代理”、“欺骗性代理”的情况下是代理服务器的IP值(如果是多层代理,该值可能由多个代理服务器的IP组成,由逗号“,”分隔),在“高匿名代理”的情况下是空值。

    关于HTTP头信息中的REMOTE_ADDR、HTTP_FORWARDED_FOR值,我们在下文中有详细的介绍,假设客户端真实IP是221.5.252.160:

    一、没有使用代理服务器的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的代码可以如下:

    1. function getip() {
    2. $unknown = 'unknown';
    3. if ( isset($_SERVER['HTTP_X_FORWARDED_FOR'])
      && $_SERVER['HTTP_X_FORWARDED_FOR']
      && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'],
      $unknown) ) {
    4. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    5. } elseif ( isset($_SERVER['REMOTE_ADDR'])
      && $_SERVER['REMOTE_ADDR'] &&
      strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
    6. $ip = $_SERVER['REMOTE_ADDR'];
    7. }
    8. /*
    9. 处理多层代理的情况
    10. 或者使用正则方式:$ip = preg_match("/[\d\.]
      {7,15}/", $ip, $matches) ? $matches[0] : $unknown;
    11. */
    12. if (false !== strpos($ip, ','))
    13. $ip = reset(explode(',', $ip));
    14. return $ip;
    15. }

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

深入分析几种PHP获取客户端IP的情况相关推荐

  1. WebService(JAX-WS、XFire、Axis三种)获取客户端ip

    WebService(JAX-WS.XFire.Axis三种)获取客户端ip JAX-WS.XFire.Axis三种webservice的获取客户端IP的简单实现过程: 1,基于JDK6 jax-ws ...

  2. php获取ip几种方法区别,php获取客户端IP地址的几种方法

    php获取客户端IP地址的几种方法 阅读php获取客户端IP地址的几种方法, 1:来看看代码: echo "(1)浏览当前页面的用户的 IP 地址为:"; echo $_SERVE ...

  3. php获取客户端IP地址的几种方法(转)

    php获取客户端IP地址的几种方法方法一 <?php $iipp=$_SERVER["REMOTE_ADDR"]; echo $iipp; ?>方法二<?php ...

  4. 网页获取客户端IP的两种方法

    不用英文写了哈: 在网页上获取客户端IP地址是件容易的事,用JavaScript以下代码即可: ip = '<!--#echo var="REMOTE_ADDR"--> ...

  5. 负载均衡获取客户端IP

    C#获取客户端IP. 最近遇到一个需要做鉴权的接口,有IP鉴权的需求,需要知道客户端HTTP请求的IP. 试了好多种方法,发现都有问题.最终尝试 ip = HttpContext.Current.Re ...

  6. 记录:通过第三方获取接口获取客户端IP,并判断当前IP是否在中国境内

    前言 项目需要根据客户的ip判断当前是否在中国大陆境内访问前端系统,实现一定的业务. 通过第三方获取接口获取客户端IP,并判断当前IP是否在中国境内(不包括香港.台湾). 当前文章记录完整的实现流程. ...

  7. c# 获取客户端IP地址方法

    客户端ip: Request.ServerVariables.Get("Remote_Addr").ToString();  客户端主机名: Request.ServerVaria ...

  8. JS获取客户端IP地址、MAC和主机名的7个方法汇总

    今天在搞JS(javascript)获取客户端IP的小程序,上网搜了下,好多在现在的系统和浏览器中的都无效,很无奈,在Chrome.FireFox中很少搞到直接利用ActiveX获取IP等的JS脚本. ...

  9. 如何在PHP中获取客户端IP地址[重复]

    本文翻译自:How to get the client IP address in PHP [duplicate] This question already has an answer here: ...

最新文章

  1. LeetCode: Longest Consecutive Sequence
  2. python爬去百度文库_利用Python语言轻松爬取数据[精品文档]
  3. JavaScript命名规范与变量声明的注意事项
  4. 【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 )
  5. LSGO软件技术团队2015~2016学年第十一周(1109~1115)总结
  6. kali 切换root权限_Ubuntu 被曝严重漏洞:切换系统语言 + 输入几行命令,就能获取 root 权限...
  7. 人工智能写小说python_1月下旬值得一读的10本技术新书(人工智能、C++、Python数据科学等)!文末有福利!...
  8. 关于Apt注解实践与总结【包含20篇博客】
  9. 系统运行后修改linux系统时区
  10. api wke_给Webkit内核的浏览器控件增加互交功能
  11. CAN FD协议描述
  12. USGS下载遥感影像——以Landsat影像下载为例
  13. Objective-C 函数
  14. 前端三大主流框架如何去选择?
  15. 为什么存储服务器硬盘格式化不,硬盘为什么不能格式化
  16. 分享,请不要忽视了作者的版权
  17. 美团网2015秋季校园招聘面试题(上)
  18. C语言time.h中srand(),rand()等等函数产生随机数的用法。
  19. 鸿蒙系统2.0的编译
  20. ubuntu桌面美化mac_教程:为你的linux桌面带来Mac OS Mojave的体验

热门文章

  1. Java子类继承(二):隐藏成员变量和方法重写的理解
  2. HTML、JSP、Servlet中的相对路径和绝对路径 页面跳转问题
  3. Java中设计模式之工厂模式-4
  4. powershell 备份文件脚本
  5. c语言位运算 求1个整数的二进制数有多少个1
  6. c语音 udp最大长度_c语言udp自定义头文件 网络通信程序
  7. python安装了怎么使用_Python PyCharm 安装与简单使用
  8. 求素数的方法完整归纳,学的不仅是“求素数”!
  9. 国服被ban咋看_LOL国服十大神人霸哥
  10. Dubbo3.0|阿里巴巴服务框架三位一体的选择与实践