Yertuwernat
@Yertuwernat
Кратко о себе: живу в России, не женат, характер

Какой способ получения IP лучше?

Нагуглил два способа выявления IP-адреса:

$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = @$_SERVER['REMOTE_ADDR'];
 
if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client;
elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward;
else $ip = $remote;

//здесь не понятно зачем нужна собака @, и зачем фильтровать и обязательно ли это делать?


function get_ip()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}


Какой из них лучше?
Или предложите свой вариант.

И дополнительный вопрос - можно ли использовать строку с IP в качестве имени txt.файла?
file_put_contents("$ip.txt");
  • Вопрос задан
  • 742 просмотра
Пригласить эксперта
Ответы на вопрос 4
gromdron
@gromdron
Работаю с Bitrix24
Ну хз, на мой взгляд это не равноценные примеры: субьективно читать первый не проще, я бы отдал предпочтение функции get_ip(), с другой стороны второй пример не делает того же, что делает первый (например валидацию не проводит).

/**
 * Return client ip if find, or null
 * @return string|null
 */
function getUserIp()
{
    static $ip;

    if ( !is_null($ip) )
    {
        return $ip;
    }

    $candidates = [
        @$_SERVER['HTTP_CLIENT_IP'],
        @$_SERVER['HTTP_X_FORWARDED_FOR'],
        @$_SERVER['REMOTE_ADDR']
    ];

    foreach ($candidates as $candidate)
    {
        if ( \filter_var($candidate, \FILTER_VALIDATE_IP) )
        {
            $ip = $candidate;
            break;
        }
    }

    return $ip;
}

var_dump(getUserIp());
Ответ написан
Комментировать
@synapse_people
Какие у вас хорошие функции) В плане того, что если я пошлю заголовок X_FOWVARDED_FOR - ваш сайт получит левый ип, а не реальный) П.с. не все веб сервера стандартной конфы отрезают этот заголовок
Поэтому, добавьте хотя бы проверку на reverse_proxy_ips
Ответ написан
@Yan-s
IP в $_SERVER['REMOTE_ADDR'];

Собака (подавление ошибок) на тот случай, если какой то из заголовок не был передан (тогда произойдет обращение к несуществующему ключу массива), а фильтрация, потому что там может быть не IP.

можно ли использовать строку с IP в качестве имени txt.файла?

Кто вас остановит? Но если фактически сам файл не нужен, лучше использовать БД.
Ответ написан
@alexalexes
Как договоритись с админом сети, или как принято на хостинге.

https://habr.com/post/177113/

//здесь не понятно зачем нужна собака @, и зачем фильтровать и обязательно ли это делать?

Собака отключает логирование ошибки в вызове элемента массива.
Например:

$client = $_SERVER['HTTP_CLIENT_IP'];

Если вдруг в массиве $_SERVER не окажется элемента с ключом 'HTTP_CLIENT_IP', то в лог-файл сервера запишется предупреждение об этом.
Чтобы предупреждений не было можно поступить так:

$client  = array_key_exists('HTTP_CLIENT_IP',  $_SERVER) ?  $_SERVER['HTTP_CLIENT_IP'] : '';


или так, как в вопросе, с использованием собаки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы