Универсальная функция определения ip адреса

08.09.2016

Оставлю просто заметочку о том, как можно получить ip адрес пользователя, адреса прокси и т.п. 

/**
 * Get user ip address
 * @param bool $single
 * @return array|null|string
 */
public function getUserIPAddresses($single = false)
{
    $ip_addresses = [];

    if($single) {
        return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
    }

    $headers = [
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR'
    ];

    foreach ($headers as $header) {
        if(isset($_SERVER[$header])) {
            foreach (explode(',', $_SERVER[$header]) as $ip){
                $ip = trim($ip);

                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    $ip_addresses[$ip] = $ip;
                }
            }
        }
    }

    return $ip_addresses;
}

 

Все просто, если параметр $single установить в true, получаем просто ip адрес (строка). Если просто вызвать функцию, получим ввиде массива всевозможные ip адреса (прокси если есть и т.п.)

К получаемым ip адресам применяется фильтр, который исключает зарезервированные диапазоны 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24 и224.0.0.0/4, а так же частные диапазоны 10.0.0.0/8,172.16.0.0/12 и 192.168.0.0/16. Если это не нужно, можно просто удалить флаги FILTER_FLAG_NO_PRIV_RANGE и FILTER_FLAG_NO_RES_RANGE соответственно.

comments powered by HyperComments