Как получить правильный IP-адрес из HTTP_X_FORWARDED_FOR, если он содержит несколько IP-адресов? - PullRequest
30 голосов
/ 16 апреля 2009

Если Request.ServerVariables ["HTTP_X_FORWARDED_FOR"] возвращает несколько IP-адресов, какой из них мне взять и как мне это сделать в c #? Насколько я понимаю, если оно пустое или пустое, клиентский компьютер не проходит через прокси-сервер, и я могу просто получить их ip из Request.ServerVariables ["REMOTE_ADDR"]. Это правильное утверждение?

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

Ответы [ 4 ]

38 голосов
/ 16 апреля 2009

Согласно это , формат HTTP-заголовка X-Forwarded-For:

X-Forwarded-For: client1, proxy1, proxy2, ...

Таким образом, IP-адрес клиента, который вы хотите, должен быть первым в списке

3 голосов
/ 24 июня 2009

Еще одна заметка по вопросу надежности:

Любой может подделать HTTP_X_FORWARDED_FOR, используя такой инструмент, как плагин Firefox «Tamper Data» или собственный локальный прокси-сервер (например, Privoxy). Это означает, что вся строка может быть фиктивной, а REMOTE_ADDR является фактическим исходным хостом. Это также может означать, что первый адрес «client1» является фальшивым, а затем клиент подключается через прокси-сервер, в результате чего proxy1 является IP-адресом клиента, а REMOTE_ADDR - единственным используемым прокси.

Если вы хотите запретить доступ на основе IP, я бы рекомендовал проверить каждый IP-адрес в заголовке XFF, а также REMOTE_ADDR.

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

Как уже заметил Mastermind, существуют прокси, которые скрывают цепочку прокси. Например, сеть Tor будет отображать запрос, как будто он поступил с конечного прокси-сервера, а не с исходного IP-адреса. Анонимные прокси часто заявляют, что они перенаправляют на тот же IP-адрес, который указан в REMOTE_ADDR.

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

3 голосов
/ 16 апреля 2009

Некоторое время назад я задал очень похожий вопрос.

Получение IP-адреса клиента: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, что еще может быть полезным?

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

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

0 голосов
/ 27 апреля 2012

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

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1

Обратите внимание на использование $ 1 для установки переменной среды XFFCLIENTIP для хранения содержимого первой группы в регулярном выражении (в скобках).

В качестве примера использования этого вы можете определить формат журнала, который использует переменную: этот пример - тот, который мы используем внутренне на nearmap.com, так что он регистрирует дополнительную информацию, но бит, который вы хотите - % {XFFCLIENTIP} e в начале. Обратите внимание на env = XFFCLIENTIP в конце строки, что означает, что этот формат используется, только если установлена ​​переменная окружения.

CustomLog /var/log/apache2/access.log "%{XFFCLIENTIP}e \"%{session}C\" \"%{nearmapuid}C\" %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" env=XFFCLIENTIP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...