Подтвердить что ты не робот

Как получить правильный IP-адрес из HTTP_X_FORWARDED_FOR, если он содержит несколько IP-адресов?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Еще одно замечание по теме надежности:

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

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

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

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

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

Ответ 4

Фактический 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