Веб-инфраструктура должна сбрасывать заголовки "x-forwarded-*"?
Учитывая веб-инфраструктуру, с:
WEB -> HTTP PROXY -> NGINX -> PHP
Мы используем "X-forwarded-{for,host} от Php, чтобы получить реальный IP и хост. Но иногда мы получаем неправильные значения, и я обнаруживаю, что можно установить эти поля следующим образом:
curl -sL http://www.toto.com -H "X-Forwarded-For: 1.96.0.1"
Как разработчик, у меня нет доступа к конфигурации haproxy/nginx и нашей инфраструктуре. ребята говорят, что это ошибка разработчика.
Отсюда мой вопрос: передний HTTP-прокси должен удалить пользовательские поля "X-forwarded" перед отправкой запроса на сервер приложений?
1 ответ
Ошибка предполагает, что крайнее левое значение в X-Forwarded-For
это адрес клиента. Это не так, как это должно работать.
X-Forwarded-For
работает, добавляя адрес из входящего соединения справа от входящего значения заголовка, если оно есть.
Правильное решение - приложение начинает читать справа, удаляя доверенные адреса, когда оно перемещается влево, а затем останавливается.
Самый правый ненадежный адрес - это адрес, который вы ищете.
X-Forwarded-For: 192.168.1.5, 203.0.113.5, 10.0.0.5
Допустим, 10.0.0.5 является прокси. Nginx добавил этот адрес, потому что соединение пришло с прокси. Вы знаете этот адрес и доверяете ему, чтобы он всегда добавлял адрес увиденного клиента, поэтому вы удаляете его из списка. Это не браузер. Вы знаете, благодаря доверию к этой машине, что следующий адрес слева является верным и правильным и был добавлен прокси.
После удаления 10.0.0.5 вы обнаружите, что 203.0.113.5 теперь является самым правым адресом. Поскольку вы только что удалили доверенный адрес, вы знаете, что 203.0.113.5 является правильным, но вы не распознаете и, следовательно, не можете доверять какой-либо дополнительной информации слева от этого адреса. Если 203.0.113.5 является веб-прокси, принадлежащим внешней организации, то следующий слева адрес, 192.168.1.5, может быть адресом браузера за этим устройством или он может быть подделан. В конечном счете, это не имеет значения, потому что самый правильный ненадежный адрес, 203.0.113.5 - это адрес, который вы хотите. Это адрес внешней машины, подключенной к вашему стеку.
Возможно, вы захотите зарегистрировать или иным образом сохранить значения дальше слева, но вы не можете принимать решения, основываясь на чем-либо, кроме самого правого оставшегося адреса, после удаления любого доверенного адреса, потому что это единственный, которому вы можете верить.
Важно отметить, что вы должны прекратить дальнейшую обработку по адресу с крайнего правого ненадежного устройства, потому что, если слева от этой точки появляется доверенный адрес, он подделывается.