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

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

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

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

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

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

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

in_array($user_ip,$allowedIPS)

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

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

9 ответов


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

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


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

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

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

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


IP-спуфинг возможен, если нетривиален.

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


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

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

EDIT:управление доступом Apache инструкция. Я предполагаю, что вы используете Apache из-за использования PHP, если вы действительно используете IIS, его все еще конфигурация управляемая установка, но, очевидно, отличается в своем исполнении.


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

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

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

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

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


Я поддержал ладью на этом. Вы не можете подделать TCP-соединение, и еще из той же машины делать подмены. Почему? Потому что ответ, который ваш веб-сервер сделает (изначально), будет на поддельный IP-адрес в попытке установить соединение сокета (TCP 3-way handshake).

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

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

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

надеюсь, что это помогает.


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


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

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

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

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


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