#c# #asp.net
#c# #asp.net
Вопрос:
Я хочу прочитать значение X-Forwarded-For
значения заголовка в запросе.
Я пытался
HttpContext.Current.Request.Headers["X-Forwarded-For"].Split(new char[] { ',' }).FirstOrDefault();
в C #.
ИЛИ мне нужно разделить заголовок на ":"
и взять вторую строку? Я спрашиваю об этом, потому что Википедия говорит
Общий формат поля таков: X-Переадресованный-Для: client1, proxy1, proxy2
Комментарии:
1. ваш код правильный, за исключением того, что я бы сделал именно это: HttpContext.Current. Запрос. Заголовки [«X-Forwarded-For»]. Разделение(‘,’).FirstOrDefault();
Ответ №1:
Формат, который вы получаете в ответ, является client1, proxy1, proxy2
Таким образом, вы разделяете его запятой и получаете первый IP-адрес вашего клиента.
Комментарии:
1. ЭТО ПРЕДЛОЖЕНИЕ ОПАСНО, в частности, если используется для контроля доступа. Исходный клиент также может добавить заголовок X-Forwarded-For к своему запросу, а затем, как правило, вставить туда внутренний IP-адрес. Google «X-Перенаправленный-для взлома». Вы должны проделать обратный путь и утверждать, что каждый адрес является прокси, которым вы управляете. Когда вы сталкиваетесь с IP-адресом, который вы не знаете, вы используете его в качестве адреса клиента. Таким образом, если хакер начнет список с IP-адреса, возможно, того, который вы распознаете как внутренний для вашей сети, вы не будете доверять ему.
2. @stolsvik Я думаю, что вы никогда не должны использовать ip для контроля доступа в любом случае. IP-адрес предназначен для статистики и для проверки на плохое поведение, если это возможно.
Ответ №2:
Если поможет, это простой способ получить IP-адрес пользователя, учитывая заголовок X_FORWARDED_FOR
var forwardedFor = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
var userIpAddress = String.IsNullOrWhiteSpace(forwardedFor) ?
Request.ServerVariables["REMOTE_ADDR"] : forwardedFor.Split(',').Select(s => s.Trim()).FirstOrDefault();
Ответ №3:
Не забывайте, что X-Forwarded-For может содержать все, что там записывает клиент. Он может содержать XSS или SQL-инъекцию внутри.
Ответ №4:
Иногда первый может содержать один из локальных (частных) зарезервированных адресов, который бесполезен. Также первые позиции открыты для подмены.
Обновление — апрель 2018: Выборка случаев с веб-сайтом реального производства, где первый адрес является локальным (частным), указывает на некоторую проблему с конфигурацией в сети конечного пользователя или его интернет-провайдера. Случаи происходят редко (<1%) и постоянно для одних и тех же конечных пользователей.
Приведенный ниже ответ предлагает перемещаться справа налево, пока вы не нажмете общедоступный адрес. Не уверен, что кто-то действительно это делает, но это указывает на проблему.
https://husobee.github.io/golang/ip-address/2015/12/17/remote-ip-go.html