简述如何获取请求方的IP地址,及php相关获取函数解析

        针对如何获取请求方的IP地址,我们在这里简单的做一个分析:获取ip的函数方法有多种多样,但是基于的原理基本都是根据TCP/IP协议,http也是一样。ip被包含在tcp/ip的数据包中,通过相应的函数可以获取这个ip数据。如下图所以。


原文地址:侯哥小博http://37blog.com/?p=67


简述如何获取请求方的IP地址,及php相关获取函数解析_第1张图片

          下面解析一下,不同的函数获取ip的区别和联系:

         1、getenv()函数方法:getenv()函数获取环境变量的值。(注意这个函数不支持IIS下的php)

                    HTTP_CLIENT_IP 是代理服务器发送的HTTP头,HTTP_CLIENT_IP确实存在于http请求的header里。如果是“超级匿名代理”,则返回none值。

                   getenv("REMOTE_ADDR")用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。

                 

                          //获取用户IP的完整代码:
                        function get_client_ip()
                 {
                     $IP = '';
                     if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
                         $IP = getenv('HTTP_CLIENT_IP');
                    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
                        $IP = getenv('HTTP_X_FORWARDED_FOR');
                    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
                        $IP = getenv('REMOTE_ADDR');
                    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
                        $IP = $_SERVER['REMOTE_ADDR'];
                   }
                        return $IP ? $IP : "unknow";
                }
           2、 $_SERVER数组方法: $_SERVER 是一个包含诸如头信息(header)、路径(path)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;

                 $_SERVER["REMOTE_ADDR"]可以获取正在浏览网页的客户端ip地址,理论上可以通过伪造http头信息来更改ip地址,但实际中是否容易伪造,未有尝试。

                一下方法可以比较安全的获取ip        

          $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
         $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
         echo $user_IP

你可能感兴趣的:(php)