簡體   English   中英

PHP:無法在共享主機和某些VPS上獲得訪問者IP

[英]PHP: Can't get visitor IP on shared hosting and some VPS

問題是我無法在某些共享主機或VPS上獲得訪問者IP。

這是我的“強大功能”:

function get_IP(){
    $findIP=array(
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR'
    );
    $blacklistIP=array(
        '127.0.0.1',
        '255.255.255.255',
    );
    $ip = '';
    foreach($findIP as $http)
    {
        if(function_exists("getenv"))
        {
            $ip = getenv($http);
        }
        else
        {
            if (array_key_exists($http, $_SERVER) !== false){
                foreach (explode(',', $_SERVER[$http]) as $findIP){
                    $ip = trim($findIP);
                }
            }
        }
        if(function_exists("filter_var") && !empty($ip) && in_array($ip, $blacklistIP)===false)
        {
            if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) return $ip;
        }
        else if(preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $ip) && !empty($ip) && in_array($ip, $blacklistIP)===false)
        {
            return $ip;
        }
    }
    return '0.0.0.0';
}

該功能在普通服務器上可以完美地工作,但是某些共享和VPS給我帶來了很多問題。

某些服務器返回我127.0.0.1而在某些服務器上, HTTP_CLIENT_IPHTTP_X_FORWARDED_FORHTTP_X_FORWARDEDHTTP_X_CLUSTER_CLIENT_IPHTTP_FORWARDED_FORHTTP_FORWARDEDREMOTE_ADDR返回為空或未設置。

我的錯在哪里? 缺少什么或我能做什么? 謝謝!

您是否嘗試過類似https://github.com/symfony/http-foundation/blob/master/Request.php#L792-L834的內容

我認為symfony會因其受歡迎程度而正確處理。 如果沒有,您可以過print_r($_SERVER)嗎?

好吧,我正在研究這個問題,我會給你關於我的問題的答案:

/*
* IP Address Lookup
* @author Ivijan-Stefan Stipic
*/
function get_IP(){
    // check any protocols
    $findIP=array(
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR',
        'BAN_CHECK_IP',
        'HTTP_X_FORWARDED_HOST'
    );
    // IP blacklist - you can add array from your database
    $blacklistIP=array(
        '127.0.0.1',
        '255.255.255.255',
    );
    $ip = '';
    // start looping
    foreach($findIP as $http)
    {
        // Check in $_SERVER
        if (array_key_exists($http, $_SERVER) !== false){
            $ip=$_SERVER[$http];
        }
        // check in getenv() for any case
        if(empty($ip) && function_exists("getenv"))
        {
            $ip = getenv($http);
        }
        // Check if here is multiple IP's
        if(!empty($ip))
        {
            $ips=explode(",",$ip);
            $ipMAX=count($ips);
            if($ipMAX>0)
            {
                if($ipMAX > 1)
                    $ip=trim(end($ips));
                else
                    $ip=trim($ips[0]);
            }
        }
        // Check if IP is real and valid
        if(function_exists("filter_var") && !empty($ip) && in_array($ip, $blacklistIP)===false && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false)
        {
            return $ip;
        }
        else if(preg_match('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $ip) && !empty($ip) && in_array($ip, $blacklistIP)===false)
        {
            return $ip;
        }
    }
    return '0.0.0.0';
}

代碼內部的問題是,有時X轉發器返回多個IP逗號分隔,這會造成問題。 另外,某些主機可以是IP,某些被禁止的IP地址可以訪問您的網站。 我添加了該規則並提取了一個IP,可以將其作為列表。 這給了我一個深層的IP地址查找。

感謝您的幫助,有人-1因為迫使我深入研究問題並解決。 我認為這是互聯網上最完整的IP地址查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM