Задать вопрос
@kx13
Python разработчик

Почему браузеры и curl дают разные результаты?

Нашел один интересный сайт https://www.b2b-energo.ru/ (может есть и другие похожие, но мне попался этот), захотел скачать его с помощью curl и наткнулся на очень интересную особенность.
Я пытался скачивать заглавную страницу сайта, поэтому куки и прочая персональная информация здесь не принципиальна.

Если я открываю эту страницу в браузере, то браузер делает несколько редиректов и затем отображает страницу.
Для более точной проверки я запустил wireshark и сделал захват пакетов при запросе страницы в браузере.
Начало работы выглядит так:
192.168.0.156	91.206.127.244	HTTP	543	GET / HTTP/1.1 
91.206.127.244	192.168.0.156	HTTP	684	HTTP/1.1 307 Temporary Redirect  (text/html)
...
тут следует несколько редиректов, пока в конце-концов не возвращается страница
...
91.206.127.244	192.168.0.156	HTTP	595	HTTP/1.1 200 OK  (text/html)


Но если я пытаюсь скачать эту же страницу через curl
curl -v https://www.b2b-energo.ru/
То на запрос мне сразу же приходит ответ 200 с какой-то непонятной страницей.
Я, конечно, добавлял в вызову curl стандартные заголовки, которые отправляет бразузер, но дело это не меняло.

Я перепробовал все популярные браузеры, они все работают одинаково.

Для ручных запросов использвал curl, postman, прямую запись в сокет байтов запроса.

Но в браузерах всегда был редирект, а в других утилитах всегда возвращается сразу страница.

Т.к. у меня есть wireshark, то я взял побайтный дамп пакета, который отправляет браузер и с помощью python напрямую отправил эти данные в сокет. Т.е. я с точностью до байта отправил то, что отправляет браузер. Но даже в этом случае при дословном воспроизведении запроса мне возвращался ответ 200, а не 307.

При ручной отправке порядок пакетов такой.
192.168.0.156	91.206.127.244	HTTP	543	GET / HTTP/1.1 
91.206.127.244	192.168.0.156	HTTP	833	HTTP/1.1 200 OK  (text/html)

Т.е. на запрос - ответ сразу 200.
Как видно размер запроса одинаковый т.к. это копия запроса от браузера, а размер ответа совершенно другой хотя это должна быть стандартная заглавная страница.

Закрадывается идея, что сервер принимает во внимание не только данные запроса, но что-то еще.

Хочется узнать почему сервер на один и тот же запрос (с точностью до байта) при отправке из браузера делает редирект, а при ручной отправке запроса возвращает какую-то страницу?
На основании чего он принимает решения? Хочется понять что еще может влиять на сервер?
А может только у меня так странно работает?

Я раньше думал, что на одинаковые запросы будут одинаковые ответы, но в некоторых случаях похоже получается иначе.
  • Вопрос задан
  • 850 просмотров
Подписаться 4 Средний 9 комментариев
Решения вопроса 1
ValdikSS
@ValdikSS
На сайте используется TLS Fingerprint (вероятно, JA3) как один из индикаторов сессии в системе перед веб-сервером, вероятно, это анти-DDoS.
Так как браузер и curl используют разные SSL-библиотеки и передают разные наборы шифров, сервер предлагает вам пройти challenge.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
и чтобы два раза не вставать
https://habr.com/ru/articles/596411/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы