Сервер Caddy, X-перенаправленное и поддельное значение

#python #flask #caddy

#питон #фляжка #кэдди

Вопрос:

Использование Caddy server и reverse_proxy сервера, подобного следующему :

 my.domain.com {
    reverse_proxy * unix//path/to/socket
}
 

Я могу легко получить доступ к заголовкам моих запросов, выполнив следующие действия в Python / Flask:

 request.headers.get('X-Forwarded-For')
 

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

 # Using Python requests
requests.get('https://my.domain.com', headers={'X-Forwarded-For': 'www.google.com'})
 

В этом случае значение заголовка равно :

X-Forwarded-For: www.google.com, xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx в этом случае является моим действительным IP-адресом).

Мой вопрос: как я могу с уверенностью получить IP-адрес клиента, исключая любую подделку?

Подробные сведения:

Я протестировал следующие заголовки в Flask, для всех которых установлено значение None, используя мою приведенную выше конфигурацию Caddy:

 Remote Addr: 0.0.0.0
X-Forwarded-For: www.google.com, xxx.xxx.xxx.xxx
Remote-Addr: None
Client-Ip: None
X-Forwarded: None
X-Cluster-Client-Ip: None
Forwarded-For: None
Forwarded: None
 

Комментарии:

1. Я не понимаю проблемы, поэтому caddy добавляет к фактическому X-Forwarded-For , а не переопределяет его. Вы можете просто взять последний или настроить caddy для переопределения этого заголовка. Я не имею отношения к понижению голосов

2. Заблуждение заключается в том, что Caddy не добавляет фактический X-Forwarded-For, он добавляет его! Это то, что вызвало проблему здесь, но заставило меня задуматься, может ли быть изменен весь заголовок, о том, как с уверенностью полагаться на этот заголовок.

Ответ №1:

Как указано в Википедии, общий формат X-Forwarded-For :

 X-Forwarded-For: client, proxy1, proxy2
 

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

В этом примере запрос прошел через proxy1, proxy2, а затем caddy (не показан в заголовке). caddy отображается как удаленный адрес запроса.

Поскольку легко подделать поле X-Forwarded-For, данную информацию следует использовать с осторожностью. Самый правый IP-адрес всегда является IP-адресом, который подключается к последнему прокси-серверу, что означает, что это самый надежный источник информации.

Короче говоря: выберите последнее значение!