Можно ли подделать ваш IP... безопасно ли проверять ip-адреса?


У меня есть некоторые дополнительные функции на сайте, которые могут использовать сотрудники, но клиентам запрещено их видеть.

Все сотрудники будут работать в нескольких доменах.

Что я делаю, так это получаю ip-адрес пользователя следующим образом:

$user_ip = gethostbyname($_SERVER['REMOTE_ADDR']);

Затем я получаю массив всех IP-адресов для доменов, которые будут использовать пользователи gethostbyname

Затем я проверяю, находится ли пользователь в одном из доменов, например:

in_array($user_ip,$allowedIPS)

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

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

Author: JD Isaacks, 2010-09-10

9 answers

Невозможно подделать TCP-соединение через открытый Интернет из-за трехстороннего рукопожатия. Однако, возможно, можно получить доступ к этой функции с помощью CSRF.

PHP извлекает $_SERVER['REMOTE_ADDR'] непосредственно из TCP-сокета Apache, там на него не может повлиять злоумышленник. И да, я просмотрел этот код.

 8
Author: rook, 2010-09-10 18:29:09

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

Нет, если только они также не имеют доступа к сетям одного из разрешенных IP-адресов, или любая из разрешенных машин под одним из IP-адресов не скомпрометирована и трафик прокси-серверов.

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

Обратите внимание, что Подмена IP-адресов обычно имеет другое значение, чем то, которое вы используете. Это означает только подделку адреса источника пакета. Это само по себе бесполезно, потому что для доступа к сервису также необходимо было бы получить ответ от сервера. Даже "подмена IP-адресов" в этом смысле сегодня встречается редко из-за лучшей маршрутизации.

 8
Author: Artefacto, 2010-09-10 18:20:31

Подмена IP-адресов возможна, если она нетривиальна.

Почему бы вам просто не попросить своих сотрудников войти в систему, чтобы получить доступ к функциям только для сотрудников?

 2
Author: Amber, 2010-09-10 18:13:12

Если вы собираетесь это сделать, сделайте это с помощью конфигурации apache, а не с помощью кода. Вы в основном заново изобретаете функциональность, встроенную в is.

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

ИЗМЕНИТЬ: Инструкции по управлению доступом Apache . Я предполагаю, что вы используете Apache из-за использования PHP, если вы на самом деле используете IIS, это все еще настройка, управляемая конфигурацией но явно отличается по своему исполнению.

 2
Author: Serapth, 2010-09-10 18:17:28

Я не думаю, что это возможно, потому что, когда вы делаете запрос на сервер, вы фактически просите своего провайдера запросить сервер.

До тех пор, пока вы проверяете все метаданные HTTP, которые провайдер пересылает вам, такие как X-FORWARDED-FOR и метаданные прокси-сервера, вы должны иметь возможность поддерживать строгую систему..

Вот диаграмма, которая может помочь вам понять, что я имею в виду: alt text

Подробнее читайте здесь информация.

Http://www.astahost.com/info.php/hacker39s-view-easy-spoofing-ip-address_t13807.html

 2
Author: RobertPitt, 2010-09-10 18:21:58

Я поддержал ЛАДЬЮ в этом вопросе. Вы не можете подделать TCP-соединение и при этом получить доступ к своему сайту с той же машины, которая выполняет подмену. Почему? Потому что ответ вашего веб-сервера (изначально) будет на поддельный IP-адрес при попытке установить соединение с сокетом (3-стороннее рукопожатие TCP).

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

Если IP-адреса, используемые в поддельном вызове, являются внутренними в вашей подсети, то внутренние рабочие станции будут получать пакеты TCP ACK для неинициированных пакетов TCP SYN и отклонять их или игнорировать. Я не знаю ни о какой реализации стека TCP/IP, которая пыталась бы выполнить 3-стороннее рукопожатие только для пакетов ACK; это нарушает стандартный протокол.

Подмена - это метод затопления UDP, при котором злоумышленник выполняет атаку DOS (Отказ в обслуживании), используя фальшивый IP-адрес, чтобы попытаться скрыть свои следы.

Надеюсь, это поможет.

 0
Author: Eric, 2010-09-10 18:46:51

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

 0
Author: Michał Tatarynowicz, 2010-09-10 20:34:41

Когда мы столкнулись с аналогичным вопросом, мы пришли к выводу, что если пользователь обращается к нам по http, мы не можем полностью полагаться на их IP-адрес, потому что они могут использовать прокси-сервер. Но https - это всегда прямое соединение; он не допускает прокси-серверов, поэтому мы могли быть уверены, что IP-адрес, который мы видели, был правильным. Поэтому мы заблокировали наших пользователей на основе IP-адреса, ПЛЮС они должны были получить доступ к сайту по протоколу https (и войти в свою учетную запись, конечно конечно).

Ваш случай звучит немного иначе, чем наш, но я бы сказал, что вышесказанное должно быть полезно и для вас.

Даже если вы не следуете этому точному пути, вам нужно знать о прокси-серверах. Прокси-сервер теоретически может разрешить любому количеству разных пользователей доступ к вашему сайту с одного IP-адреса, поэтому, если вам каким-то образом удастся включить IP-адрес прокси-сервера в свой список разрешенных адресов, вы откроете дыру в системе безопасности, поэтому вам нужно быть уверенным, что любой IP-адрес, который вы добавление в список является законным (здесь может помочь https).

Кроме того, если ваши пользователи заходят со своих домашних компьютеров, имейте в виду, что их IP-адрес может со временем измениться. Большинство интернет-провайдеров предоставляют своим клиентам динамические IP-адреса, которые могут быть переназначены, что означает, что каждый раз, когда вы подключаетесь к Интернету, есть вероятность, что вы получите другой IP-адрес. Если это так, то подмены не происходит, но, тем не менее, вы не сможете надежно идентифицировать пользователя по его IP-адресу адрес.

 0
Author: Spudley, 2010-09-10 21:26:24

Все возможно, но это всегда вопрос стоимости.
В большинстве случаев такая подделка не стоит

 -1
Author: Your Common Sense, 2010-09-10 18:12:34