Archive

Archive for the ‘Live HTTP Headers’ Category

Анализ трафика HTTP

February 9th, 2010 No comments

Продолжение серии статей об Интернет-ботах.

Часть 1, Часть 2, Часть 3

Когда вы набираете в браузере адрес URI, он делает примерно то же самое, что мы делали в предыдущей статье с помощью Telnet-клиента. Но отправляет больше заголовков. Например, информацию о нем самом, о версии вашей ОС, передает cookies при их наличии. При переходе по ссылке отправляется адрес, откуда пользователь пришел на сайт. Различных заголовков очень много и описывать их все здесь не имеет смысла.

Для создания программы, эмулирующей браузер (Интернет-бот), необходим тщательный анализ цепочки HTTP запросов браузера и ответов на них.

Средства анализа

Существуют различные средства анализа трафика. Можно, например, установить специальный сетевой драйвер-фильтр. Однако значительно проще воспользоваться плагином к браузеру. Мне нравится вот этот (для Firefox): Live HTTP Headers.

Итак, нужен плагин. Этот или другой, главное, чтобы он сканировал заголовки как запросов, так и ответов.

Запускаем его и вводим в браузере «www.ya.ru». Я вижу вот что:

http://ya.ru/
 
GET / HTTP/1.1
Host: ya.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
 
HTTP/1.x 200 OK
Server: nginx
Date: Mon, 25 Jan 2010 22:21:14 GMT
Content-Type: text/html; charset=utf-8
Last-Modified: Tue, 12 Jan 2010 15:29:03 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip

Это стартовые строки и заголовки реального браузерного запроса и ответа ему. Здесь видно, что Firefox умеет принимать сжатый ответ, о чем сообщил серверу Яндекса. Тот это понял и прислал сообщение, упакованное методом gzip.

Отправка формы

Для примера, оставим комментарий на Свиттере.

К сожалению, большинство комментариев, посупающих на модерацию, именно такие :) Итак, подготавливаем форму, как на картинке, запускаем плагин мониторинга HTTP, нажимаем «Отправить».

Запрос:

POST /wp-comments-post.php HTTP/1.1
Host: svitter.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://svitter.ru/?p=378
Content-Type: application/x-www-form-urlencoded
Content-Length: 350
 
author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5&email=x%40x.com&url=x.com&comment=%D0%9A%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D0%BE%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5%2C+%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0+%D0%BF%D0%BE+%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B5&submit.x=54&submit.y=12&submit=Submit+Comment&comment_post_ID=378&comment_parent=0

Браузер отправляет запрос методом POST, передвая введенную нами информацию в теле сообщения. Оно имеет такой вид:

param1=value1&param2=value2&param3=value3

Где param1, param2, param3 – имена параметров, а value1, value2, value3 – их значения. Таких пар имя-значение может быть сколь угодно много. Пробелы браузер заменил на «+», кирилицу и прочие специальные символы на их коды вида %XX или %XX%YY (если символ кодируется двумя байтами).

author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5&email=x%40x.com&url=x.com&comment=%D0%9A%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D0%BE%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5%2C+%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0+%D0%BF%D0%BE+%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B5&submit.x=54&submit.y=12&submit=Submit+Comment&comment_post_ID=378&comment_parent=0

Следует читать как:

author=Окна ПВХ&
email=x@x.com&
url=x.com&
comment=Купить окна ПВХ, доставка по Москве&
submit.x=54&
submit.y=12&
submit=Submit+Comment&
comment_post_ID=378&
comment_parent=0

Вот так можно оставлять комментарии на Свиттере Telnet-клиентом. Просто добавьте воды введите нужные заголовки и тело запроса.

Ответ:

HTTP/1.x 302 Moved Temporarily
Via: 1.1 RGW
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Transfer-Encoding: chunked
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Date: Tue, 26 Jan 2010 16:05:10 GMT
Location: http://svitter.ru/?p=378&cpage=1#comment-349
Content-Type: text/html
Server: nginx/0.7.62
Keep-Alive: timeout=20
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
X-Powered-By: PHP/5.3.1
Set-Cookie: comment_author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5; expires=Sat, 08-Jan-2011 21:25:10 GMT; path=/
Set-Cookie: comment_author_email=x%40x.com; expires=Sat, 08-Jan-2011 21:25:10 GMT; path=/
Set-Cookie: comment_author_url=http%3A%2F%2Fx.com; expires=Sat, 08-Jan-2011 21:25:10 GMT; path=/
Last-Modified: Tue, 26 Jan 2010 16:05:10 GMT

Стартовая строка ответа говорит о том, что надо сделать редирект, а заголовок Location поясняет, куда именно. Как правило, скрипт обработки запроса POST делает перенаправление. Во-первых, это легче запрограммировать, а, во-вторых, пользователь сможет безболезненно обновлять страницу (без предупреждений о том, что данные формы будут снова отправлены).

Обратите внимание на заголовки Set-Cookie. Таким образом сервер сообщает браузеру, что введенные автором коментария данные (имя, email и url) нужно сохранить в cookies. Благодаря этому, при отправке следующего комментария останется ввести лишь текст сообщения.

А что же делать, если для доступа к сайту необходима авторизация? Об этом я расскажу в следующей статье. (скоро)