获取客户端ip 

1.'REMOTE_ADDR' 是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。 

如:a->b(proxy)->c ,如果c 通过'REMOTE_ADDR' ,只能获取到b的IP,获取不到a的IP了。 

另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。 

2.'HTTP_X_FORWARDED_FOR','HTTP_CLIENT_IP' 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。 

HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是http协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。以下以x_forword_for例子加以说明,正常情况下,这个值变化过程。

获取客户端IP ----- HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR、REMOTE_ADDR区别\

/*

*$first true  取第一个 false 取最后一个

*/

// --- 获重客户端IP
    public function getClientIp($first = false) {
        if (isset($_SERVER)) {
            $HTTP_CLIENT_IP = $_SERVER['HTTP_CLIENT_IP'];
            $HTTP_X_FORWARDED_FOR = $_SERVER['HTTP_X_FORWARDED_FOR'];
            $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
        } else {
            $HTTP_CLIENT_IP = getenv('HTTP_CLIENT_IP');
            $HTTP_X_FORWARDED_FOR = getenv('HTTP_X_FORWARDED_FOR');
            $REMOTE_ADDR = getenv('REMOTE_ADDR');
        }
        $ipTypeArray = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'); //注意,和几个IP类型$后面的变量名一致$HTTP_CLIENT_IP 、$HTTP_X_FORWARDED_FOR、$REMOTE_ADDR
        $resultArray = array();
        foreach ($ipTypeArray as $ipType) {
            $ipString = $$ipType; //注意,此处使用了变量的变量$$
            /**
             * 判断是否为空,排除掉空字符串的干扰
             */
            if (!empty($ipString)) {
                $sourceIpArray = explode(',', $ipString);
                foreach ($sourceIpArray as $ip) {
                    $ip = trim($ip); //10.9.10.27会被在前面加上空格影响判断的正确性,所以trim空格
                    $position = strrpos($ip, '.');
                    $ipHead = substr($ip, 0, $position);
                    if (!preg_match('/^10\.9\./', $ip) && !preg_match('/^192\.168\./', $ip) && preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $ip)) {//负载均衡内部的IP要去掉,明显不对的ip要去掉
                        $resultArray[] = $ip;
                    }
                }
            }
        }
        if (count($resultArray) > 0) {
            $count = count($resultArray);
            if ($first === TRUE) {
                $realip = $resultArray[0];
            } else {
                $realip = $resultArray[$count - 1]; //注意,多个逗号间隔的IP,从右向左取最后的IP地址(排除掉负载均衡IP名单)     
            }
        }
        return $realip;
    }

 

 

参考:https://www.jb51.net/article/37690.htm

http://www.manongjc.com/article/1129.html

相关文章:

  • 2022-12-23
  • 2022-01-27
  • 2022-12-23
  • 2021-09-21
  • 2021-07-02
猜你喜欢
  • 2021-10-07
  • 2021-11-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-18
相关资源
相似解决方案