#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-адресом, который подключается к последнему прокси-серверу, что означает, что это самый надежный источник информации.
Короче говоря: выберите последнее значение!