-1

Я хочу проанализировать некоторую информацию из заголовка User-Agent: HTTP. Проблема в том, что я получаю два User-Agent: HTTP-заголовки в одном HTTP-запросе:

CONNECT www.facebook.com:443 HTTP/1.1
Host: www.facebook.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (http://iim.com/a.jph) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.
CONNECT www.facebook.com:443 HTTP/1.1
Host: www.facebook.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.
CONNECT www.facebook.com:443 HTTP/1.1

Я хочу, чтобы регулярное выражение совпадало с частью, отличной от http, например Windows NT 6.1; WOW64. Программное обеспечение анализатора потока Я использую движок Java Regex.

Мои попытки

User-Agent:\ S +. ?((.?))

Его соответствие обоим; Я хочу пропустить часть http.

1 ответ1

4

Есть несколько проблем с этим вопросом:

  • Вы не сказали нам, какой язык программирования вы используете, или, по крайней мере, какой тип регулярных выражений. POSIX? PCRE? Что-то необычное?

  • В каком контексте вы используете это? Вы используете HTTP-сервер, и клиенты отправляют такие запросы? Или вы используете прокси-сервер, который принимает эти запросы и анализирует их? Какой прокси вы используете - это то, что вы написали от руки (на каком языке?) или ты что-то скачал?

  • Из вашего поста не ясно, что вы получаете два User-Agent: заголовки, указанные в одном запросе. В вашем посте у вас, похоже, есть некоторые проблемы с разрывом строки (которые я редактировал), но кажется, что вы получаете три отдельных HTTP-запроса, и вполне нормально иметь разные User-Agent: в каждом HTTP-запросе. Если вы на самом деле получаете данные от клиента, такие как данные, которые вы видели в исходном сообщении (без переноса строки после User-Agent: и до следующего CONNECT), то кто-то пытается нарочно обмануть ваш прокси, пропустив перевод строки и пытается выполнить HTTP-конвейеризацию через ваш прокси. Соответствующая стандартам реализация будет иметь разрывы строк, даже если тело HTTP-запроса пусто.

  • Пытаться разобрать вещи с помощью регулярных выражений опасно. По крайней мере, вы должны быть готовы обработать произвольный ввод. Не существует универсально согласованного стандарта для форматирования User-Agent: string, и многие общедоступные интернет-хосты, которые подключаются к общедоступному веб-серверу, будут пытаться "запушить" сервер, отправляя ему искаженные запросы. Для клиента вполне возможно отправлять заголовки, такие как следующие, даже все в одном запросе, если они хотят:

    User-Agent: Lol, ваше регулярное выражение не будет соответствовать этому User-Agent: Mozzarella/0.-0 ((Let's) () запутать ваш reg ((ex)) ((()) ApplePie/-NaN (FUZZ, как Police) 3.14159\EvilAttacker) Пользователь-агент: Mozilla/5.0 (Windows LOL 973.1; LOL64) ...

  • Попытка понять пользовательский агент клиента и затем извлечь полезную информацию из этого глупа. Поскольку клиент может установить его на то, что ему нравится, вы не должны считать, что данный пользовательский агент вообще что- то значит. Это как если бы я сказал вам: «У меня есть миллион долларов!«- У тебя есть какая-то особая причина верить мне? Я просто утверждаю этот факт. User-Agent: ничем не отличается. Окно Windows 95 может претендовать на Windows 8.1 с IE 11. Mac OS X 10.8 может быть Red Hat Enterprise Linux 5 под управлением Firefox 2.0. Кто-то, кто намеренно пытается обмануть вас, может заявить, что его операционная система называется «AsadzOS версии 0.1».

Разумного использования заголовка User-Agent: очень мало, и в каждом из этих случаев очень важно тщательно обрабатывать все возможные сбои сопоставления, ложные срабатывания, ложные отрицания и т. П. ваш парсер, сдаваясь, если вы не можете понять смысл ввода.

Вдобавок ко всему этому, это вопрос к StackOverflow, поскольку в SuperUser совершенно не обсуждается методика программирования. Мне просто нужно было опубликовать этот подробный ответ, чтобы объяснить вам, почему это плохой вопрос.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .