Чтобы получить IP-адрес клиента в моем приложении ASP.NET, я использовал X-Forwarded-For и получил первый IP-адрес из списка (в соответствии с информацией, которую я нашел, есть клиент, proxy1, proxy2..). Но недавно я слышал, что лучше получить эту информацию из заголовка X-Forwarded-IP, потому что IP-адрес клиента в X-Forwarded-For может быть изменен прокси-сервером, какая разница и какой адрес я должен использовать
В чем разница между X-Forwarded-For и X-Forwarded-IP?
Ответ 1
X-Forwarded-For
является обычным способом идентификации исходящего IP-адреса пользователя, подключающегося к серверу web, исходящим из HTTP прокси, балансировщик нагрузки.
X-Forwarded-IP
является обычным способом идентификации исходящего IP-адреса пользователя, подключающегося к серверу электронная почта через почтовую службу HTTP.
Ответ 2
X-Forwarded-For - нестандартный заголовок, введенный первоначально Squid. Это заголовок, зависящий от прокси-сервера, который помогает серверу идентифицировать первоначальный запросчик вызова, который прошел через прокси-сервер, поэтому очевидно, что любой прокси-сервер на пути запроса должен/будет изменять X-Forwarded-For. Без прокси-сервера на пути запроса этот заголовок не должен быть даже в запросе.
Поскольку этот заголовок нестандартен, нет никакой гарантии, что вы его получите, и способ его обработки может отличаться в реализации прокси. У вас нет гарантии, что он будет содержать правильный IP-адрес.
Начиная с 2014 года, IETF одобрил стандартное определение заголовка для прокси, называемое "Переадресовано", зарегистрированное здесь https://tools.ietf.org/html/rfc7239, которое должно использоваться вместо заголовков X-Forwarded. Это тот, который вы должны надежно использовать, чтобы получить исходный IP-адрес, если ваш запрос обрабатывается прокси-сервером.
В общем, заголовки прокси (Forwarded или X-Forwarded-For) - это правильный способ получить IP-адрес вашего клиента только тогда, когда вы уверены, что приходят к вам через прокси-сервер. Если нет прокси-заголовка или нет полезного значения, вы должны по умолчанию использовать серверную переменную REMOTE_ADDR.