Прежде чем начать понимать X-Forward-For, давайте рассмотрим сценарий. Вы специалист по поисковым роботам и теперь хотите просканировать контент на целевом веб-сайте xxx.com. При кодировании вы обнаружите, что частота запросов в единицу времени слишком высока, и она будет ограничена.Целевой веб-сайт ограничен IP-адресом. Теперь у вас есть два варианта:
- Автономно, используйте IP-прокси для решения проблемы ограничения высокой частоты.
- Многомашинный, используйте распределенный сканер, чтобы решить проблему ограничения IP-адреса одной машины.
Поскольку целевой веб-сайт нужно просканировать только один раз,Автономный + IP-проксиЭта комбинация стоит меньше, поэтому вы выбираете ее. После покупки прокси-сервиса у поставщика услуг IP-прокси xx вы выполнили новый раунд тестирования.Фрагмент кода Forwarded-Test является тестовым кодом.
import requests
# 请求地址
targetUrl = "http://111.231.93.117/"
# 代理服务器
proxyHost = "220.185.128.170"
proxyPort = "9999"
proxyMeta = "http://%(host)s:%(port)s" % {
"host": proxyHost,
"port": proxyPort,
}
proxies = {
"http": proxyMeta,
}
# 设定一个 Referer
header = {
"Referer": "http://www.sfhfpc.com",
}
resp = requests.get(targetUrl, proxies=proxies, headers=header)
print(resp.status_code)
print(resp.text)
Фрагмент кода, отправленный тестом
После запуска кода вы обнаружите, что вы все еще ограничены!
Внезапно я почувствовал большую головную боль, поэтому я искал соответствующую информацию в основных поисковых системах, таких как:
неверный IP-прокси
Определить ip-прокси
IP-прокси найден
Вы нашли вещь, упомянутую во многих статьях X-Forward-For, все говорили, что она можетсмотреть сквозьIP-прокси.
Итак, возникает вопрос:
- Что такое X-Forward-For?
- Почему X-Forward-For узнал, что мы использовалиIP-прокси
- как это можно найтиисходный IPШерстяная ткань?
- Есть ли способ обмануть X-Forward-For?
С этими вопросами давайте изучим X-Forward-For.
Что такое X-Forward-For
Подобно Referer и User-Agent, X-Forward-For — это поле заголовка в HTTP. HTTP/1.1RFCНомер документа 2616, а X-Forward-For не упоминается в 2616, значит, X-Forward-For родился не тогда, когда появился HTTP/1.1. Именно RFC7239 в 2014 году фактически предложил X-Forward-For (см.woohoo RFC-editor.org/RFC/RFC7239…X-вперед-для какHTTP-расширениеПоявляться.
RFC: Полное название «Запрос на комментарии» представляет собой серию документов, упорядоченных по номерам. Он собирает информацию о протоколе, связанном с Интернетом, и вы можете абстрактно понимать RFC2616 как спецификацию протокола HTTP/1.1. Подробную интерпретацию спецификации протокола Websocket см. в книге "Python3 Anti-Crawler Principles and Bypassing Practice".
Все правильные описания X-Forward-For написаны в RFC7239, и все спецификации, соответствующие HTTP, также соответствуют RFC7239. Конечно, вы также можете выбратьнесоблюдение.
Несоответствие. На самом деле, RFC — это только спецификация и соглашение в качестве эталона для унифицированного поведения каждого, и он не применяется. Многие методы противодействия сканированию должны найти другой путь, приняв стратегию, отличную от соглашения RFC. Конкретные идеи и случаи противодействия сканированию см. в книге «Принципы противодействия сканированию Python3 и обход реального боя».
RFC7239 настолько длинный, что нам не нужно читать их один за другим. На самом деле есть только несколько частей, которые имеют отношение к нам, например:
1.Abstract
7.5. Example Usage
Аннотация представляет собой краткое изложение этой статьи, в котором описывается, что делает RFC7239:
This document defines an HTTP extension header field that allows proxy components to disclose information lost in the proxying process, for example, the originating IP address of a request or IP address of the proxy on the user-agent-facing interface. In a path of proxying components, this makes it possible to arrange it so that each subsequent component will have access to, for example, all IP addresses used in the chain of proxied HTTP requests.
This document also specifies guidelines for a proxy administrator to anonymize the origin of a request.
Грубо говоря, в этой статье определяется (расширяется) поле заголовка HTTP, которое позволяет прокси-компоненту раскрывать исходный IP-адрес.
Отсюда мы понимаем, что основная цель X-Forward-For — помочь серверу идентифицировать исходный IP-адрес и выполнять динамическую обработку на основе исходного IP-адреса. Например, когда сервер выполняет балансировку нагрузки по IP-адресу, если он можетсмотреть сквозьIP-прокси, получите исходный IP-адрес, затем вы можете сделатьэффективныйнагрузка. В противном случае это может привести к неравномерному распределению ресурсов, что приведет кПоддельная балансировка нагрузкивозникает ситуация.
Пример использования дает пример использования X-Forward-For:
A request from a client with IP address 192.0.2.43 passes through a proxy with IP address 198.51.100.17, then through another proxy with IP address 203.0.113.60 before reaching an origin server. This could, for example, be an office client behind a corporate malware filter talking to a origin server through a reverse proxy.
o The HTTP request between the client and the first proxy has no "Forwarded" header field.
o The HTTP request between the first and second proxy has a "Forwarded: for=192.0.2.43" header field.
o The HTTP request between the second proxy and the origin server has a "Forwarded: for=192.0.2.43, for=198.51.100.17;by=203.0.113.60;proto=http;host=example.com" header field.
Предположим, исходный IP-адрес — 192.0.2.43, его запрос использует прокси с адресом 198.51.100.17, а перед достижением целевого сервера 203.0.113.60 используется другой прокси (в статье предполагается, что другой прокси — 222.111.222.111).
В этой ситуации
- В HTTP-запросе между клиентом и первым прокси-сервером нет поля заголовка Forwarded.
- В HTTP-запросе между первым прокси-сервером и вторым прокси-сервером есть поле заголовка Forwarded, а поле заголовка и значение Forwarded: for=192.0.2.43 .
- В HTTP-запросе между вторым прокси и сервером есть поле заголовка Forwarded, а поле заголовка и значение Forwarded: for=192.0.2.43, for=198.51.100.17;by=203.0.113.60;proto=http;host=example.com"
Рисунок перенаправленный клиент-сервер изображает описанный выше сценарий.
Рисунок перенаправленный клиент-сервер
Значение пустое или прочерк, потому что клиентский запрос к прокси 1 не использует прокси. При достижении прокси-сервера 2 прокси-сервер 1 передается посередине, поэтому значение является исходным IP-адресом. При достижении сервера прокси 1 и прокси 2 передаются посередине, поэтому значением является исходный IP-адрес и IP-адрес прокси 1.
Выше приведена интерпретация части содержимого RFC7239. Увидев это, у вас должна быть подсказка, давайте посмотрим на это дальше.
Эксперимент с IP-прокси
Сначала я установил и запустил Nginx на своем тестовом сервере, и его формат журнала по умолчанию выглядит следующим образом:
log_format main
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
То есть файл access.log будет записывать IP-адрес клиента, время клиента, метод запроса, код состояния ответа, размер тела ответа, Referer, User-Agent и список агентов.
Совет: значение, соответствующее $http_x_forwarded_for в Nginx, здесь называется списком прокси, что имеет то же значение, что и Forwarded в RFC7239.
Когда я использую браузер терминала компьютера для доступа к адресу тестового сервера, соответствующие записи журнала выглядят следующим образом:
180.137.156.168 - - [24/Nov/2019:12:41:19 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Safari/605.1.15" "-"
Смысл информации, записываемой сервером, следующий:
- IP клиента 180.137.156.168
- Время клиента [24/ноября/2019:12:41:19 +0800]
- Метод запроса — GET/HTTP/1.1.
- Код статуса ответа 200
- Размер тела ответа 612
- Реферер — прочерк, то есть пустой
- User-Agent показывает бренд браузера как Safari
- В списке прокси стоит прочерк, то есть он пустой.
Поскольку на этот раз IP-прокси не используется, в списке прокси, естественно, стоит прочерк. Затем давайте проверим его с кодом Python.Фрагмент кода Python-Request является тестовым кодом.
import requests
resp = requests.get("http://111.231.93.117/")
print(resp.status_code)
Фрагмент кода Python-запрос
Результат выполнения кода — 200, то есть целевой сервер правильно ответил на запрос. Соответствующие записи журнала выглядят следующим образом:
180.137.156.168 - - [24/Nov/2019:12:49:41 +0800] "GET / HTTP/1.1" 200 612 "-" "python-requests/2.21.0" "-"
На этот раз IP-прокси также не используется, поэтому список прокси остается пунктирным. Теперь протестируйте его с IP-адресом прокси.IP-прокси используется во фрагменте кода Forwarded-Test, поэтому мы можем использовать его для тестирования. IP-адрес прокси-сервера здесь — 220.185.128.170.Согласно предыдущему пониманию RFC7239 предполагается, что пересылаемая запись, соответствующая этому запросу, будет исходным IP, а IP клиента — это IP прокси-сервера.
После запуска кода сервер записывает соответствующую информацию журнала следующим образом:
220.185.128.170 - - [24/Nov/2019:12:52:58 +0800] "GET / HTTP/1.1" 200 612 "http://www.sfhfpc.com" "python-requests/2.21.0" "180.137.156.168"
Разумеется, IP-адрес клиента в записи соответствует 220.185.128.170, что является IP-адресом прокси-сервера. 180.137.156.168, записанное в Forwarded, — это IP-адрес компьютера, на котором находится программа Python, то есть исходный IP.
Это точно соответствует описанию RFC7239, сервер может найти исходный IP-адрес через Forwarded, даже IP-адрес используемого прокси-сервера.
Шаловливое IP-агентство
Только что мы использовали общий IP-прокси, потому что его легко идентифицировать, его невозможно добиться.Спрятатьцели, поэтому IP-агент снова запустилсяВысокий анонимный агент.
Прокси-сервер с высокой секретностью: по сравнению с обычным IP-прокси, после использования прокси-сервера с высокой секретностью исходный IP-адрес будет лучше скрыт, и сервер будет труднее найти.
Здесь я использовалкунжутный агентБесплатный высокосекретный IP-адрес, предоставляемый поставщиком услуг, вы можете получить бесплатный IP-адрес после регистрации, который просто готов.
Измените значения полей, используемых для установки IP-адреса прокси-сервера и номера порта во фрагменте кода Forwarded-Test, на IP-адрес с высоким уровнем безопасности и соответствующий номер порта, например:
# 代理服务器
proxyHost = "58.218.92.132" # "220.185.128.170"
proxyPort = "2390" # "9999"
После сохранения изменений и запуска кода соответствующие записи журнала выглядят следующим образом:
125.82.188.4 - - [24/Nov/2019:13:05:07 +0800] "GET / HTTP/1.1" 200 612 "http://www.sfhfpc.com" "python-requests/2.21.0" "-"
Исходный IP — 125.82.188.4, а список прокси — прочерк. Осторожно у вас могут возникнуть вопросы, почему прокси прописан IP 58.218.92.132, а в логе его нет?
Это дополнительная передача поставщиком услуг агента.58.218.92.132 - запись для пользователя.Сервер агента перешлет запрос с записью 58.218.92.132 на адрес 125.82.188.4. Нам не нужно углубляться в процесс, принципы работы агентов высокой секретности и обычных агентов будут рассмотрены в другой статье.
Регистрация показывает, что IP с высоким уровнем безопасности может помочь нам достичьСпрятатьцель. Говоря об этом, я должен упомянуть, что качество высокосекретного IP-адреса Sesame Proxy действительно хорошее.Я слышал, что их IP также поддерживает высокие одновременные вызовы.Друзья, которым это нужно, могут попробовать.
Остроумный вы и разработчики, которых вы считаете само собой разумеющимся
Обязаны ли X-Forward-For обнаруживать обычные прокси?
Всегда будет способ, переверни егоwww.sfhfpc.comили публичный аккаунтВэй Шидун изучает алгоритмы и антикраулерыМожет вдохновение придет! При интерпретации RFC7239 — Example Usage мы узнали, что X-Forward-For записывает исходный IP, а в случае использования многоуровневого IP-прокси — верхний IP. Можно ли воспользоваться этой функцией?кузницакак насчет?
Поскольку X-Forward-For является полем заголовка, как и Referer, это означает, что его можно изменить искусственно. Нам нужно только добавить заголовок запроса X-Forward-For и соответствующее значение в запрос. Фрагмент кода Python-Request-CustomHeader реализует такое требование.
import requests
# 请求地址
targetUrl = "http://111.231.93.117/"
# 代理服务器
proxyHost = "220.185.128.170"
proxyPort = "9999"
proxyMeta = "http://%(host)s:%(port)s" % {
"host": proxyHost,
"port": proxyPort,
}
proxies = {
"http": proxyMeta,
}
header = {
"Referer": "http://www.sfhfpc.com",
"X-Forwarded-For": "_",
}
resp = requests.get(targetUrl, proxies=proxies, headers=header)
print(resp.status_code)
print(resp.text)
Фрагмент кода Python-Request-CustomHeader
После запуска кода результаты консоли выглядят следующим образом:
200
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Код состояния ответа — 200, и возвращаются слова Welcome to nginx, что указывает на то, что запрос был выполнен успешно. Соответствующие записи журнала:
220.185.128.170 - - [24/Nov/2019:14:13:24 +0800] "GET / HTTP/1.1" 200 612 "http://www.sfhfpc.com" "python-requests/2.21.0" "_, 180.137.156.168"
Записи показывают, что исходный IP-адрес — 220.185.128.170, а манифест прокси — «_, 180.137.156.168». На самом деле исходный IP-адрес — 180.137.156.168, а IP-адрес прокси-сервера — 220.185.128.170. Лишние черточки в списке прокси добавлены нами в коде, они же здесь и отображаются. Это показывает, что нам нужно только прикрепить поле заголовка X-Forward-For к запросу для достижениякузницацель.
Если я хочу, чтобы сервер думал, что исходный IP-адрес — 112.113.115.116, мне просто нужно установить значение, соответствующее ключу X-Forwarded-For в объекте заголовка во фрагменте кода Python-Request-CustomHeader, на 112.113.115.116.
После сохранения и запуска кода соответствующие записи журнала выглядят следующим образом:
220.185.128.170 - - [24/Nov/2019:14:28:08 +0800] "GET / HTTP/1.1" 200 612 "http://www.sfhfpc.com" "python-requests/2.21.0" "112.113.115.116, 180.137.156.168"
Согласно RFC7239 — Example Usage, разработчик будет думать, что первая группа IP-адресов в списке прокси — это исходный IP, но он специально для него подготовлен.
резюме
X-Forward-For — это поле заголовка расширения протокола HTTP, которое может идентифицировать исходный IP-адрес после нескольких уровней прокси. Беспокойные люди никогда не любили соблюдать условности и нормы, и они пришли в замешательство. Для получения дополнительной информации о толковании протокола RFC и мерах по предотвращению сканирования, реализуемых при нарушении соглашения, обратитесь к книге «Принципы и практика обхода Python3 по предотвращению сканирования».
Совет: нажмите на ссылку "Получить IP бесплатно«Вы можете зайти на Sesame Proxy, чтобы получить бесплатный IP.
Уведомление об авторских правах
Автор: Вэй Шидун
источник:www.sfhfpc.com
Авторские права принадлежат автору. Пожалуйста, указывайте источник для некоммерческой перепечатки. Коммерческая перепечатка запрещена.