Как остановить запрос изменений модуля запроса NodeJS при использовании прокси

Извините, если это покажется запутанным.

Я написал скрипт, используя модуль запроса NodeJS, который запускается и выполняет функцию на веб-сайте, а затем возвращает данные. Этот скрипт отлично работает, когда я не использую прокси-сервер, установив для него значение false. Это не та задача, которую НЕЛЬЗЯ выполнять с помощью Selenium/puppeteer.

proxy: false

Однако, когда я установил (рабочий) прокси. Он не выполняет ту же задачу и обнаруживается программным обеспечением брандмауэра/антибота веб-сайта.

proxy: http://xx.xxx.xx.xx:3128

Некоторые вещи, которые следует отметить:

  • Я пробовал множество (более 20) разных поставщиков прокси-серверов (Residential и Datacenter), и у всех у них была эта проблема.
  • Проблема не возникает, если этот прокси-сервер установлен глобально в моей системе.
  • Проблема не возникает, если этот прокси установлен в расширении Chrome.
  • Наборы шифров SSL не соответствуют Chrome, но они по-прежнему не совпадают, когда не используется прокси-сервер, поэтому я предполагаю, что проблема не в этом.
  • Очень важно соблюдать последовательность в порядке заголовков.

Вопрос в принципе. Изменяет ли что-нибудь модуль запроса при использовании прокси, такого как порядок заголовков?

Вот изображение того, что происходит, когда он проходит/не проходит. введите описание изображения здесь

Единственная разница заключается в смене прокси-сервера, который приводит к сбою. Один запрос делается с, один запрос делается без.

url    : url,
simple : false,
forever: true,
resolveWithFullResponse: true,
gzip: true,
headers: {
    'Host'             : 'www.sitename.com',
    'Connection'       : 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent'       : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
    'Accept'           : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-encoding'  : 'gzip, deflate, br',
    'Accept-Language'  : 'en-GB,en-US;q=0.9,en;q=0.8',
},
method : 'GET',
jar: globalJar,
simple: false,
followRedirect: false,
followAllRedirects: false, 

person Community    schedule 19.03.2019    source источник
comment
Вам нужно показать, как вы используете proxy-   -  person Marcos Casagrande    schedule 25.03.2019
comment
proxy: http://xx.xxx.xx.xx:3128 @MarcosCasagrande То, как это задокументировано в библиотеке запросов   -  person    schedule 25.03.2019
comment
Я не думаю, что порядок заголовков HTTP важен. Если вы хотите проверить свои заголовки, вы можете использовать https://httpbin.org/anything.   -  person t.m.adam    schedule 31.03.2019
comment
Привет @ t.m.adam - я понимаю, что порядок заголовков в очень нормальных обстоятельствах не важен. В этом случае порядок заголовков важен и предотвратит выполнение. Я сделаю схему для дальнейшей помощи   -  person    schedule 31.03.2019
comment
Странно, порядок заголовков не должен иметь значения (см. rfc2616). Что это за сервер?   -  person t.m.adam    schedule 31.03.2019
comment
@ t.m.adam Малейшее изменение порядка заголовков вызывает сбой (даже без прокси-сервера). Изменение порядка заголовков обратно заставляет его снова работать. Весь смысл этой программы в том, чтобы помешать мне получить доступ, поскольку браузеры используют определенные порядки заголовков при каждом запросе, когда порядок неверен, он знает, что это не браузер, и вызывает сбой.   -  person    schedule 31.03.2019
comment
А, это имеет смысл. Тогда, возможно, прокси-сервер добавляет заголовки, обнаруженные брандмауэром — например, X-Forwarded-For. Вы можете использовать httpbin.org, чтобы увидеть, какие заголовки получает сервер.   -  person t.m.adam    schedule 31.03.2019
comment
Это не так. Кроме того, прокси отлично работают при использовании их для моего компьютера или в качестве расширения для Chrome (на том же веб-сайте).   -  person    schedule 31.03.2019
comment
Можете ли вы предоставить 2 дампа отправленных заголовков?   -  person Willem    schedule 31.03.2019
comment
stackoverflow.com/ вопросов/23585371/ не мог бы этот вопрос помочь вам?   -  person Dupocas    schedule 03.04.2019
comment
Любопытный случай. Вы подтверждаете, что порядок заголовков меняется с прокси?   -  person hackape    schedule 03.04.2019
comment
@hackap привет. Порядок заголовков не меняется с прокси.   -  person    schedule 05.04.2019
comment
Я предполагаю, что когда вы используете общесистемный прокси-сервер или прокси-сервер расширения Chrome, вы получаете доступ к рассматриваемому веб-сайту из браузера, а не из своего скрипта? Потому что ваш скрипт все равно проигнорирует эти настройки. Это верное предположение?   -  person Sergey Nudnov    schedule 05.04.2019
comment
@SergeyNudnov На самом деле нет, если я использую общесистемный прокси и запускаю скрипт без прокси (поэтому он использует общесистемный), он все равно работает.   -  person    schedule 05.04.2019
comment
Как вы думаете, почему он использует общесистемный прокси?   -  person Sergey Nudnov    schedule 05.04.2019
comment
Узел @ConorReid на самом деле не будет использовать прокси-сервер вашей системы, если я не ошибаюсь. Это должно быть реализовано в приложении, которое требует этого, поэтому вместо этого вы, вероятно, делаете прямой запрос. Кроме того, какие прокси вы используете? Вы их размещаете или пробуете публичные/платные?   -  person WoLfulus    schedule 06.04.2019
comment
@ проблема еще не решена, не так ли? Так что некоторые лог-файлы прокси все же будут полезны.   -  person David    schedule 08.04.2019


Ответы (4)


Согласно документации по прокси модуля запроса:

По умолчанию при проксировании http-трафика запрос просто делает стандартный проксируемый http-запрос. Это делается путем создания раздела URL-адреса начальной строки запроса с полным URL-адресом конечной точки.

Вместо этого вы можете использовать https://en.wikipedia.org/wiki/HTTP_tunnel, установив:

tunnel : true

в настройках прокси модуля запроса.

Возможно, в вашем случае вы делаете стандартный HTTP-запрос через прокси, тогда как при глобальном использовании прокси в вашей системе или расширении Chrome создается http-туннель.

Из документации:

Обратите внимание, что при использовании туннельного прокси заголовок авторизации прокси и любые заголовки из пользовательского списка proxyHeaderExclusiveList никогда не отправляются на сервер конечной точки, а только на прокси-сервер.

person Jannes Botis    schedule 01.04.2019
comment
К сожалению, происходит та же ошибка. Настройка туннеля, создание агента через туннель (все способы). Все ломаются :( - person ; 03.04.2019
comment
@ConorReid Можете ли вы получить доступ к другим URL-адресам, кроме этого? Я вижу, вы также используете «Upgrade-Insecure-Requests», URL-адрес веб-сайта http или https? Если он поддерживает https, попробуйте установить туннель: false. Вы можете увидеть настройку туннеля здесь: github.com/request/request#requestoptions-callback - person Jannes Botis; 03.04.2019

После деактивации моей старой учетной записи я хотел вернуться и дать фактический ответ на этот вопрос, теперь я полностью понимаю ответ. То, о чем я спрашивал год назад, было невозможно. Антибот снимал отпечатки пальцев через TLS ClientHello (и даже немного на уровне TCP/фрейма).

Для начала я написал свою оболочку под названием request-curl, которая обернула двоичные файлы libcurl/curl в единую библиотеку с тем же форматом, что и request-promise, это дало мне гораздо больший контроль над запросом (предотвращение кодирования, поддержка http2/proxy и дальнейший контроль сеанса/TLS). ) это все еще позволило мне достичь 687-го рейтинга самых популярных ClientHello (https://client.tlsfingerprint.io:8443/). Это было недостаточно хорошо.

Пришлось пошевелить языком. NodeJS — это слишком высокоуровневый язык, чтобы обеспечить действительно глубокий контроль (приходилось изменять пакеты, отправляемые с уровня 3). Итак, как ответ на мой вопрос.

Это пока невозможно сделать в NodeJS, не говоря уже о сейчас неподдерживаемой библиотеке request.js.

Для тех, кто читает это, если вы хотите подделывать идеальные запросы для обхода защиты от ботов, вы должны перейти на другой язык: я рекомендую utls в Golang или BouncyCastle в C#. Удачи вам, поскольку мне потребовался год, чтобы на самом деле узнать, как это сделать. Даже тогда у этих языков есть больше внутренних проблем и функций, которые они еще не предполагают (Go не поддерживает «базовый» порядок заголовков, вам нужно исправлять/модифицировать внутренние компоненты и т. д., utls не легко поддерживает прокси). У этого списка нет конца.

Если вы еще не слишком углубились в это, это чертовски кроличья нора, и я рекомендую вам не входить в нее.

person HelloConor    schedule 19.05.2020

Есть несколько сценариев, о которых я могу думать

  • Прокси фактически добавляет некоторые заголовки к окончательному запросу (чтобы идентифицировать вас на сервере)
  • Веб-сайт, на который вы пытаетесь попасть, имеет ваши IP-адреса прокси-серверов в черном списке (общедоступные/платные?)

Это действительно зависит от того, почему вам нужно использовать этот прокси

  • Это из-за сетевых ограничений?
  • Это потому, что вы хотите скрыть исходный адрес запроса?

Кроме того, если у вас есть контроль над прокси-сервером, можете ли вы регистрировать запросы, направляемые на конечный сервер?

Мое предложение

Попробуйте написать свой собственный прокси (обратный) и разместить его где-нибудь. Вместо запроса на https://target.com на ваш http[s]://proxy. com/ и пусть обратный прокси сделает всю работу. Кроме того, не забудьте отключить заголовки X в реализации, так как это изменит заголовки запроса.

Ссылка на реализацию node.js:

https://github.com/nodejitsu/node-http-proxy

Примечание: дайте мне знать о вопросах, которые я задал в комментариях

person WoLfulus    schedule 06.04.2019
comment
Прокси не добавляет заголовки. Я проверил на своем собственном веб-сервере. Я также использовал более 20 бесплатных/платных прокси. Многие люди, кажется, не понимают, что это работает глобально и как расширение Chrome. Если проблема в заголовках, это тоже не сработает. - person ; 07.04.2019

Вы используете http-схему для вашего запроса, но если веб-сервер перенаправляет http на https и если прокси-сервер не настроен на прием перенаправлений (на https), то проблема может быть только в схеме, соответственно, в URL-адресе, который вы вводите. .

Таким образом, прокси-сервер должен был быть настроен для приема перенаправлений или URL-адрес должен был проверяться вручную в случае сбоев, а затем корректироваться в случае перенаправления.

Здесь вы можете прочитать о редиректах на одном прокси-сервере (Apache Traffic Server), сценарий там включает больше редиректов, чем я описал выше:
https://docs.trafficserver.apache.org/ru/4.2.x/admin/reverse-proxy-http-redirects.en.html#handling-origin-server-redirect-responses

Если вы все еще сталкиваетесь с проблемами, серверные журналы прокси-сервера будут полезны.

EDIT:
Согласно его странице @Jannes Botis связан с тем, что существует еще больше прокси-настроек, которые могут поддерживать или нарушать желаемую функциональность, поэтому вся проблема, возможно, заключается в правильной настройке прокси-сервера. Вот несколько настроек, которые напрямую связаны с редиректами:

followRedirect - follow HTTP 3xx responses as redirects (default: true). This property can also be implemented as function which gets response object as a single argument and should return true if redirects should continue or false otherwise.
followAllRedirects - follow non-GET HTTP 3xx responses as redirects (default: false)
followOriginalHttpMethod - by default we redirect to HTTP method GET. you can enable this property to redirect to the original HTTP method (default: false)
maxRedirects - the maximum number of redirects to follow (default: 10)
removeRefererHeader - removes the referer header when a redirect happens (default: false). Note: if true, referer header set in the initial request is preserved during redirect chain.

Вполне возможно, что на провал или успех вашего сценария влияют и другие настройки прокси-сервера.

person David    schedule 06.04.2019