Почему у меня неправильно определяется IP пользователя?

Ссылка скопирована
1 ответ

Всю жизнь определял IP при помощи переменной окружения, и всегда это работало:

echo $_SERVER['REMOTE_ADDR'];

Тут недавно столкнулся с ситуацией, когда вдруг: $_SERVER['REMOTE_ADDR'], Ipconfig в командной строке и 2ip.ru показали мне 3 разных айпишника. Раньше показывали всегда один и тот же, сейчас корректно показывает только 2ip.ru, остальные - адреса каких-то промежуточных прокси, причем разные. И не у меня одного такая ситуация.

Нагуглил на SO функцию:

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; }

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, но тут же комментарий, что нельзя пользоваться данными из HTTP заголовков, это небезопасно.

Поэтому пара вопросов:
1) Я правильно понимаю, что Чебурнет уже совсем близко, навтыкли каких-то промежуточных прокси-серверов, что даже айпишник стало нормально не определить.

2) Ну и, собственно, как теперь все-таки правильно определять IP.

Дополнительно:

HTTPS не дал бы так просто навтыкать mitm. Ну если ты конечно сертификаты левые себе в систему не поставил.
Проверь машину на вирусы, браузер на левые расширения...

  • А можно наконец научиться давать вопросам нормальные заголовки?
  • $_SERVER['REMOTE_ADDR'] устанавливает твой веб сервер, ему вы доверяете.
    Но, если пользователь заходит через прокси сервер - то тут будет выходной ip адрес этого прокси.

    Если прокси сервер не скрывает информацию о своих клиентах то
    $_SERVER['HTTP_X_FORWARDED_FOR'] и $_SERVER['HTTP_CLIENT_IP'] должны содержать ожидаемое, но это значит нужно доверять этому прокси серверу.

    Хочешь узнать реальный ip адрес, используй javascript в браузере пользователя (т.е. придется доверять уже пользователю в плане, а отреверсит ли он твой код и не подсунет что угодно).

    Cамый известный и достаточно надежный способ (его сразу отключают любые адекватные анонимизеры) - это WebRTC. Технология позволяет двум браузерам открывать прямое соединение (да еще и udp) друг с другом, а веб сервер только организует процесс. Т.е. подняв соответствующего клиента WebRTC (погугли, правда я для php с ходу готовой библиотеки не нашел) и организовав подключение клиента с этим твоим сервером, который представляется обычным веб клиентом), ты сможешь по тому, с какого ip адреса пришло соответствующее соединение, определить настоящий, даже если пользователь использует прокси.

    Это не защитит от vpn, тут никакими способами определить ip адрес пользователя не получится, потому что с точки зрения сетевых технологий, vpn - это как бы проводок пользовательского компьютера подключили к vpn-серверу, и никакие коммуникации не пойдут иначе, если пользователь не укажет иного (можно настроить маршрутизацию на выход через разные шлюзы в зависимости от геолокации, кстати этим можно воспользоваться, разместив кучу своих серверов в разных локациях и, обращаясь к ним из браузера клиента, сравнивать ip адреса)

    • $_SERVER['REMOTE_ADDR'] устанавливает твой веб сервер, ему вы доверяете.
      Но, если пользователь заходит через прокси сервер - то тут будет выходной ip адрес этого прокси.

      Ну в этом и вопрос. Сам я никакими прокси не пользовался при заходе на сайт, но они откуда-то взялись, причем разные.

      Вот мне и интересно кто их понаставил и зачем.

      За идею с WebRTC спасибо.

    • Хочешь узнать реальный ip адрес, используй javascript в браузере пользователя (т.е. придется доверять уже пользователю в плане, а отреверсит ли он твой код и не подсунет что угодно).

      Непонятно, зачем пользователю что-то специально "реверсить", если там и так будет адрес типа 10.10.10.99. А клиентских компьютеров, напрямую светящих голой попкой в интернет, исчезающе мало.

      Ну и про WebRTC очень смешной совет. Лучше было остановиться на первых двух абзацах.

    Ответы:

    Чтобы определить IP адрес, надо сначала разобраться с кашей в своей голове.

    Сначала надо задать себе вопрос, а какое вообще отношение имеет Ipconfig к адресу клиента. И после долгих мучительных размышлений вдруг сообразить, что все три адреса совпадают, когда разрабатываешь сайт на уютном домашнем компике, а при размещении у провайдера адрес в Ipconfig никогда не будет совпадать, поскольку внезапно там будет будет адрес сервера, а не клиента

    После этого надо посмотреть на сам адрес. В котором, скорее всего, тоже будет адрес из приватной сети.
    И нелепые фантазии про чебурнет вдруг превратятся в провайдера, который поставил нормальный веб-сервер проксировать запросы к ламерским сайтам хомячков.
    После этого выяснить у провайдера, в каком именно НТТР заголовке передается исходный IP клиента, и использовать только его, а не перебирать наугад все возможные. Причем настроить на уровне веб-сервера (mod_remoteip / ngx_http_realip_module)

    $_SERVER['REMOTE_ADDR'] может некорректно показать ip из за настроек самого сервера. Если например сервер находится в докер контейнере, то без дополнительных настроек, remote_addr покажет ip контейнера, не пользователя. Тоже самое если ваш сервер сидит за каким то натом, например nuxt фронтом и тд. Это тоже нужно учитывать. В интернете куча советов на тему "remote addr показывает неверный ip".

    • Да, спасибо, проверил на других сайтах, на них верный IP отдается, значит, что-то хостер намутил.
    • Это не ответ, а совет

    Если ваш сайт сидит за CDN Cloudflare тогда IP будет неверно показываться. Вы используете Cloudflare?

    • Чтобы задать автору вопрос, надо писать комментарий под вопросом, а не ответ

    Смотри на каком ip крутиться приложение в файле hosts, если сервер запущен на домашнем ПК.
    Также смотри какой ip у провайдера если он статический, в настройках роутера обычно указан.
    Ipconfig показывает локальный адрес ПК, провайдер глобальный. Перепиши ip провайдера в hosts и в конфиг сервера если на этом ip работает приложение, тогда в 2ip будет определяться нормально.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Кирилл JS Ответ

    Проблема с неправильным определением IP пользователя может иметь несколько причин. Вот некоторые из них, а также способы их решения:

    1. Прокси-серверы и VPN: Если пользователь использует прокси-сервер или VPN, то IP-адрес будет определяться как IP-адрес прокси-сервера, а не реальный IP пользователя. В этом случае, можно использовать HTTP заголовок X-Forwarded-For для получения реального IP пользователя. Например, в PHP вы можете использовать следующий код:

    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }

    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; }

    2. Ошибки в настройках сервера: Иногда неправильное определение IP может быть вызвано ошибкой в настройках вашего веб-сервера. Убедитесь, что конфигурация сервера правильно передает IP-адрес пользователя.

    3. Кеширование IP-адреса: Если вы используете какой-то механизм кеширования IP-адресов, например Cloudflare, то это также может привести к неправильному определению IP. Убедитесь, что ваш механизм кеширования правильно передает IP-адрес пользователя.

    4. Проблемы с DNS: Иногда проблема может быть связана с DNS. Убедитесь, что ваш сервер правильно настроен для разрешения IP-адресов.

    Если после проверки всех вышеперечисленных причин проблема все еще остается, попробуйте обратиться к вашему хостинг-провайдеру или администратору сервера для дальнейшей диагностики проблемы.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно