Nano Hash - криптовалюты, майнинг, программирование

Надежна ли переменная веб-сервера $_SERVER['REMOTE_ADDR']?

Обычно я предполагал, что в сценарии PHP я могу проверить $_SERVER['REMOTE_ADDR'], чтобы установить IP-адрес, с которого исходит запрос. Однако я начинаю задаваться вопросом, не сложнее ли все. Вот сценарий

  • Я запускаю несколько серверов, называю их A, B и C, на которых пользователи должны быть "зарегистрированы"
  • Я запускаю отдельный сервер регистрации, называю его S, где учетные данные пользователей и т. д. сначала проверяются перед отправкой полного запроса на регистрацию на серверы A, B и C.

Запрос выходит как

file_get_contents('https://url?data=value')

На серверах A, B и C я довольно наивно тестировал $_SERVER['REMOTE_ADDR'], чтобы установить, что запрос действительно исходил от сервера S. К моему большому удивлению, результаты оказались неоднородными и непостоянными.

  1. Значением в REMOTE_ADDR был IP-адрес пользователя, взаимодействующего с сервером регистрации, S.
  2. Значением в REMOTE_ADDR был IP-адрес сервера регистрации, S — то, что я ожидал видеть все время.
  3. Значение в REMOTE_ADDR было другим IP-адресом из пула IP-адресов на виртуальном сервере, на котором размещен сервер S.

Мне действительно не нужно выполнять этот дополнительный проверочный тест, поэтому я могу вообще отказаться от него. Тем не менее, этот результат застал меня врасплох, поэтому мне любопытно посмотреть, может ли кто-нибудь здесь пролить свет на то, что происходит.

Я должен упомянуть, что я запускаю PHP 5.5 на Lighttpd на серверах A, B и C и PHP 5.3 на Apache 2 на сервере S.

24.06.2014

  • Вы используете PHP как module или fcgi/fpm? Пожалуйста, проверьте также переменные $_SERVER['HTTP_CLIENT_IP'] и $_SERVER['HTTP_X_FORWARDED_FOR'], так как все три переменные заполняются по-разному при использовании разных серверов, (обратных) прокси и конфигурации. 24.06.2014
  • Дубликаты: 1, 2. Каков ваш точный вопрос? Если это REMOTE_ADDR ненадежно, ответ да, это так, если вы ожидаете, что он всегда будет содержать какой-то конкретный адрес компьютера. Он надежен в том смысле, что он сообщает IP-адресу какого-либо компьютера, с которого идет соединение. 24.06.2014
  • IP-адрес $_SERVER['REMOTE_ADDR'] — это общедоступный IP-адрес, на который нужно напрямую ответить — его невозможно подделать (если только злоумышленник не хочет получать ответ). Из того, что в вопросе: в том, как вы тестируете, есть недостатки, так как это не так. 24.06.2014
  • @eis Это довольно вводящий в заблуждение комментарий. 24.06.2014
  • Если вы выполняете связь сервер-сервер (сервер S с сервером A), невозможно иметь IP-адрес посетителя-человека в REMOTE_ADDR. 24.06.2014
  • @eis, потому что удаленный адрес однозначен. Если бы это было ненадежно, сервер не смог бы отправить ответ клиенту (браузеру). Первый дубликат указывает на какую-то неверную настройку, это не норма; во втором четко указано это исходный IP-адрес TCP-соединения. По сути, если бы это было ненадежно, сеть в целом не работала бы. 24.06.2014
  • @ AD7six REMOTE_ADDR может указывать на брандмауэр, прокси-сервер, конечную точку VPN или что-то еще. Для этого компьютера, который я использую, я могу выбрать любой прокси-сервер, который захочу, поэтому ненадежно определить, какой компьютер я использую. Это не имеет ничего общего со способностью сервера отправлять ответ клиенту. 24.06.2014
  • @eis, пожалуйста, прочитайте вопрос еще раз - что-нибудь из этого актуально? Могу ли я сделать запрос к серверу А, серверу А, чтобы выдать file_get_contents('http://google.com'); и Google, чтобы увидеть мой общедоступный IP-адрес (или мой маршрутизатор, или мой прокси-сервер, или мой брандмауэр и т. д.)? 24.06.2014
  • @ AD7six Конечно, да. Трафик между серверами может и часто использует прокси-серверы, особенно в корпоративном контексте. Например, они также могут использовать серверы шлюзов. 24.06.2014
  • @eis, вы думаете, что DroidOS настроил свой сервер на использование клиента в качестве прокси для исходящих запросов? Мы читаем разные вопросы? Если у вас есть доказательство концепции, которая вызывает file_get_contents('http://example.com'); передачу IP-адреса конечных клиентов, я хотел бы увидеть его. 24.06.2014
  • @ AD7six AD7six Я ​​не утверждал, что DroidOS настроил прокси, и не упоминал, что он передает IP-адрес конечного пользователя. Тем не менее, я думаю, что ваше утверждение об удаленном адресе недвусмысленно. Если бы это было ненадежно, сервер не смог бы отправить ответ клиенту (браузеру). здесь вводящий в заблуждение комментарий. 24.06.2014
  • Я считаю, что REMOTE_ADDR может также содержать список IP-номеров или даже "unknown". 24.06.2014

Ответы:


1

REMOTE_ADDR — это переменная, которую заполняет Apache (или любой другой веб-контейнер), она содержит IP-адрес терминала на другом конце связи.

Это надежно? да.

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

В вашем случае сервер, отправляющий HTTP-вызов, должен предоставить свой IP-адрес, поэтому сценарий 2 должен происходить постоянно. Я не знаю, что пошло не так в какой момент, но это странно.

Чтобы ответить Dany Caissy, не полагайтесь на HTTP_X_FORWARDED_FOR, его можно легко изменить, так как это заголовок HTTP, а не свойство TCP/IP.

24.06.2014
  • Я просто даю ему варианты, я не утверждал, что какой-либо из них был безопасным или нет, он несет ответственность за безопасность, и это не является частью этого вопроса. 24.06.2014
  • Я знаю, что ваше намерение было по уважительной причине :), просто стоит отметить для людей, которые впервые читают это, что делать $myCustomersIP = $_SERVER["HTTP_X_FORWARDED_FOR"]; неправильно. Но я с вами полностью согласен :) 24.06.2014

  • 2

    REMOTE_ADDR — не единственный способ получить IP-адрес, есть также:

    HTTP_CLIENT_IP
    HTTP_X_FORWARDED_FOR
    HTTP_X_FORWARDED
    HTTP_X_CLUSTER_CLIENT_IP
    HTTP_FORWARDED_FOR
    HTTP_FORWARDED
    

    Они устанавливаются по-разному и могут означать разные вещи, в конечном счете, очень сложно получить IP-адрес, который вы хотите иметь.

    РЕДАКТИРОВАТЬ: Единственный из них, который является надежным и не может быть изменен пользователем, — это REMOTE_ADDR, но он не всегда будет делать именно то, что вы хотите, поэтому вам придется использовать другие, независимо от того, насколько «небезопасно». ' все говорят, что они есть.

    24.06.2014
  • Ей богам - нет. Даже не думайте полагаться на X_FORWARDED_FOR 24.06.2014
  • В некоторых случаях на @AlmaDo X_FORWARDED_FOR можно положиться. В частности, когда у вас есть кеш/балансировщик нагрузки перед вашим сервером и вы всегда очищаете все внешние заголовки x-forwarded-for. Ни в коем случае нельзя доверять только значениям, предоставленным пользователем. 24.06.2014
  • Его можно проверить (в лучшем случае - получить какую-то информацию). Но на него никогда не следует полагаться 24.06.2014
  • полагаться на X_FORWADED_FOR — это зияющая дыра в безопасности. См., например, эту публикацию. it is very difficult to get the IP Address you want to have. - нет =). Вопрос заключается в том, чтобы указать IP-адрес машины, инициирующей запрос, а не, например. общедоступный IP-адрес конечного клиента. 24.06.2014
  • Больше не на что полагаться. Если вы запускаете свои собственные внешние прокси для чего-либо, вы должны полагаться на x-forwarded-for. Или какой-нибудь другой заголовок, который будет иметь точно такую ​​же функцию. Единственное, что вы можете сделать для повышения доверия, это подписать поле, но я не знаю ни одного программного обеспечения, способного на это из коробки. 24.06.2014
  • @viraptor есть читается и есть полагается. Не придавайте никакого значения (за исключением, возможно, уникального, но анонимного идентификатора) заголовкам, которые определяются пользователем - см. сообщение Я ссылался ранее для примера. 24.06.2014
  • Спасибо всем за различные комментарии. Как я упоминал в своем вопросе, мне действительно не нужна дополнительная проверка IP-адреса. Данные, которые я отправляю, сильно зашифрованы и содержат строгий тайм-аут, который, в крайнем случае, гарантирует, что серверы A, B, C проигнорируют запрос. Так что я просто отказался от любого понятия тестирования IP. Тем не менее полезно отбросить свое невежество и не возлагать слепую веру на REMOTE_ADDR. Lighttpd использует PHP FastCGI, и я обнаружил, что X_FORWARDED_FOR + CLIENT_IP в любом случае не определены. 24.06.2014
  • @DroidOS они не определены, потому что вы не используете прокси. Если вы хотите ограничить доступ по IP, более уместно использовать ip-таблицы, но это всего лишь эквивалент тестирования REMOTE_ADDR, которому вы можете доверять, означая машину, на которую будет отвечать запрос. 24.06.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..