Штурмуем протокол HTTP — методы, заголовки и запросы

Штурмуем протокол HTTP — методы, заголовки и запросы Примеры скриптов и макросов для Word и WSH

Приветствую всех читателей блога scriptcoding.ru. Цель данной публикации написать программный код для анализа работы протокола HTTP с помощью языка JScript.

По ходу публикации будут рассмотрены некоторые методы HTTP и заголовки HTTP протокола, которые будут включены в наш сценарий на языке JScript. Стоит понимать, что взаимодействие с сервером может происходить не только через браузер, но и с помощью сторонних приложений и скриптов.

И так, давайте для начала познакомимся с базовыми компонентами протокола HTTP – методами и заголовками.

Протокол HTTP — методы

Протокол HTTP - методы

HTTP протокол версии НТТР/1.1 предоставляет пользователю различные методы HTTP для реализации диалога – загрузка, обновление или удаление файлов, получение содержимого Web-страниц и многое другое. Я вкратце опишу лишь те HTTP методы, которые будут включены в программный код на языке JScript сервера Windows Script Host.

Каждый раз,когда браузер запрашивает содержимое страницы с интернета, то применяется HTTP метод GET, если вам попадалась форма для загрузки файлов, то тут в силу вступал метод POST, для загрузки файлов можно применять и метод PUT, но для этого на стороне сервера должны быть сделаны дополнительные настройки. Что бы опросить сервер о его возможностях, используется HTTP метод OPTIONS, как правило (не обязательно), в ответе должен находиться заголовок Allow со списком поддерживаемых методов:

Allow: GET, HEAD, POST, TRACE, OPTIONS

Если вам нужно получить только метаданные (заголовки), без содержимого страницы, то используйте метод HEAD. TRACE – используется для диагностики сетей и работает следующим образом — клиент отправляет серверу определённую информацию, а сервер, в свою очередь, отвечает клиенту тем, что к нему пришло (грубо говоря, просто отражает пришедшую информацию).

Стоит помнить, что сервер может и не поддерживать заданный метод HTTP протокола, в таком случае будет возвращен код ответа 405 Not Allowed.

Протокол HTTP — заголовки

Протокол HTTP - заголовки

Для реализации диалога между вашим браузером и запрашиваемым ресурсом используются различные заголовки протокола HTTP, которые состоят из двух частей: имени и значения, разделенных двоеточием. Так как цель данной статьи – с помощью скрипта научится манипулировать работой сервера за счет протокола HTTP, то я рассмотрю только 6 наиболее интересных заголовков.

1 — HTTP заголовок HOST

Позволяет указать имя хоста, с которого надо получить информацию, играет роль в том случае, когда на одном ip адресе лежит несколько виртуальных серверов. Например:

  • Host: www.site.ru

Вообще то, можно указать и ip адрес, и…все что угодно, так, если попробовать зайти на Google.com, а в заголовке Host указать, ну, …. например, trulala, то получим ошибку сервера:

  • 503. That’s an error.
  • The service you requested is not available at this time.
  • Service error -27. That’s all we know.

Для bing.com получим

  • Invalid URL
  • The requested URL «/», is invalid.
  • Reference #9.16d8f557.1363373245.24111e7f

Мой сайт вас перенаправит на страницу хостера.

2 — HTTP заголовок REFERER

Собственно, включает адрес ссылки, по которой был произведен переход на другой сайт или страницу. На этом HTTP заголовке и основана вся схема реферальных ссылок (типа, сообщение: » «вы принесли нам реферала») и статистики переходов с других ресурсов.

3 — HTTP заголовок USER-AGENT

Данный заголовок http протокола содержит тип и версию браузера, версию ОС ну и даже аппаратную конфигурацию. По нему вам показывается полная или мобильная версия социальной сети Вконтакте. Даже если прописать любой неосмысленный текст вида

  • User-Agent: Godzilla (System; 200)

то Вконтакте все ровно выдаст мобильную версию.

4 — HTTP заголовок ACCEPT-LANGUAGE

Тут можно указать допустимые языки для вывода содержимого и их приоритет. Например:

  • Accept-Language: en

ВК нам выдаст страницу на английском, иконка сайта тоже будет другой.

5 — HTTP заголовок X-FORWARDED-FOR

Довольно интересный HTTP заголовок, который используется не анонимными прокси-серверами для передачи реального IP клиента. Синтаксис следующий:

  • X-Forwarded-For: client_ip, proxy1_ip, …, proxyN_ip

В браузере Firefox Mozilla даже есть отдельное дополнение, его я описал в статье «Дополнения Firefox для анализа HTTP заголовков» под идентичным названием. Конечно, выдать свой IP за другой попробовать можно, но не стоит забывать, что сервер читает и TCP пакеты, в которых хранится ваш реальный IP адрес.

6 — HTTP заголовок COOKIE

Собственно, как следует из названия, тут передаются куки, благодаря которым мы можем долгое время не вводить логин/пароль ВК. Используя наш скрипт, можете поэкспериментировать.

Протокол HTTP – приступаем к программированию

приступаем к программированию, http протокол

Для анализа работы протокола HTTP я написал небольшой скрипт на языке Jscript, он предоставляет возможность выбирать методы HTTP протокола, изменять значения полей, также можно отправить собственный HTTP заголовок, при желании. Вы можете изменить сценарий, добавив собственные поля и значения. В левом поле выводятся HTTP заголовки ответов от сервера, в нижнем – текстовое содержимое (HTML код). Для реализации формы я использовал компонент WindowSystemObject – он себя лучше зарекомендовал, чем приложение LangMF; для отправки-приема данных использовался объект WinHttpRequest.

И так, давайте приступим к программированию:

// ***********************************************************
// Анализируем HTTP протокол
// protocol_http.js 
// ***********************************************************
 
var ArrList="";
 
// Создаем экземпляр объекта WindowSystemObject
var wso = new ActiveXObject("Scripting.WindowSystemObject");
 
//---------------------------------------------------------------------------------------------------------------------------
//                                   Задаем начальные размеры и отступы
//---------------------------------------------------------------------------------------------------------------------------
var f = wso.CreateForm(0,0,0,0);
with(f){
    color=0x11001101;                                                                    // цвет
    ClientWidth = 800;                                                                        // ширина
    ClientHeight = 600;                                                                    // высота
    CenterControl();                                                                        // центрируем форму
    Text = "Методы и заголовки HTTPпротокола - анализ";                // заголовок окна
    SizeGrip = false;                                                                        // нельзя менять размеры
    MaximizeBox = false;                                                                // нельзя развернуть форму
}
//---------------------------------------------------------------------------------------------------------------------------
 
// Список выводимых HTTP заголовков
var edit1 = f.CreateEdit(0,0,400,400,wso.Translate("ES_MULTILINE"));
with(edit1){
    ScrollBars = wso.Translate("SS_BOTH");
    ReadOnly = true;
    WordWrap = true;
}
 
// Текст ответа от сервера
var edit2 = f.CreateEdit(0,410,800,190,wso.Translate("ES_MULTILINE"));
with(edit2){
    ScrollBars = wso.Translate("SS_BOTH");
    ReadOnly = true;
    WordWrap = true;
}
 
// HTTP методы GET, POST и так далее
var MethodEdit = f.CreateComboBox(420,10,80,20,wso.Translate("CBS_DROPDOWNLIST"));
with(MethodEdit){
    add("GET");
    add("POST");
    add("PUT");
    add("OPTIONS");
    add("HEAD");
    add("DELETE");
    add("TRACE");
    add("CONNECT");
    add("PATCH");
    add("PROPFIND");
    ItemIndex=0;
}
 
//Список поддерживаемых HTTP протоколов
var ProtocolEdit = f.CreateComboBox(510,10,60,20,wso.Translate("CBS_DROPDOWNLIST"));
with(ProtocolEdit){
    add("HTTP");
    add("HTTPS");
    ItemIndex=0;
}
 
//URI на который отправляется запрос
var URIEdit = f.CreateEdit(580,10,200,20,wso.Translate("ES_MULTILINE"));
URIEdit.Text="VK.com";
 
//*******************************************************************//
//Определяем имена заголовков HTTP протокола 
//*******************************************************************//
 
var HostEdit, UserAgentEdit, RefererEdit, AcceptLanguageEdit, XForwardedForEdit, CookieEdit, RandomEdit;
 
HostEdit = f.CreateEdit(420,40,100,20,wso.Translate("ES_MULTILINE"));
HostEdit.Text="Host";
 
UserAgentEdit = f.CreateEdit(420,70,100,20,wso.Translate("ES_MULTILINE"));
UserAgentEdit.Text="User-Agent";
 
RefererEdit = f.CreateEdit(420,100,100,20,wso.Translate("ES_MULTILINE"));
RefererEdit.Text="Referer";
 
AcceptLanguageEdit = f.CreateEdit(420,130,100,20,wso.Translate("ES_MULTILINE"));
AcceptLanguageEdit.Text="Accept-Language";
 
XForwardedForEdit = f.CreateEdit(420,160,100,20,wso.Translate("ES_MULTILINE"));
XForwardedForEdit.Text="X-Forwarded-For";
 
CookieEdit = f.CreateEdit(420,190,100,20,wso.Translate("ES_MULTILINE"));
CookieEdit.Text="Cookie";
 
//Пустой HTTP заголовок для личного пользования
RandomEdit = f.CreateEdit(420,220,100,20,wso.Translate("ES_MULTILINE"));
RandomEdit.Text="";
 
//*******************************************************************//
 
var DataEdit = f.CreateEdit(420,250,100,20,wso.Translate("ES_MULTILINE"));
with(DataEdit){
    Text="Данные";
    ReadOnly = true;
}
 
//*******************************************************************//
//Определяем значения заголовков HTTP протокола
//*******************************************************************//
var Host, UserAgent, Referer, AcceptLanguage, XForwardedFor, Cookie, RandomText, DataText;
 
Host = f.CreateEdit(530,40,250,20,wso.Translate("ES_MULTILINE"));
Host.Text="www.site.ru";
 
UserAgent = f.CreateEdit(530,70,250,20,wso.Translate("ES_MULTILINE"));
UserAgent.Text="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1";
 
Referer = f.CreateEdit(530,100,250,20,wso.Translate("ES_MULTILINE"));
Referer.Text="site.ru/link.html";
 
AcceptLanguage = f.CreateEdit(530,130,250,20,wso.Translate("ES_MULTILINE"));
AcceptLanguage.Text="ru-RU";
 
XForwardedFor = f.CreateEdit(530,160,250,20,wso.Translate("ES_MULTILINE"));
XForwardedFor.Text = "8.8.8.8";
 
Cookie = f.CreateEdit(530,190,250,20,wso.Translate("ES_MULTILINE"));
Cookie.Text ="felfjeljejriejri";
 
RandomText = f.CreateEdit(530,220,250,20,wso.Translate("ES_MULTILINE"));
RandomText.Text="";
 
DataText = f.CreateEdit(530,250,250,20,wso.Translate("ES_MULTILINE"));
DataText.Text="Hello";
 
//*******************************************************************//
 
var t = f.CreateHyperLink(420,310,250,25,"scriptcoding.ru");
var Button1 = f.CreateButton(420,280,100,25,"Анализировать");
Button1.OnClick = Analize;
var Button2 = f.CreateButton(530,280,100,25,"Очистить");
Button2.OnClick = Cleare;
 
//*******************************************************************//
 
f.Show()
wso.Run()
 
//Очищаем поля вывода информации
function Cleare(){
    edit1.Text="";
    edit2.Text="";
    ArrList="";
}
 
//Отправка запроса
function Analize(){
var MSG, Method, Adresse, Protokol;
var WinHttpRequest= new ActiveXObject("WinHttp.WinHttpRequest.5.1");
    MSG=DataText.Text;
    Method=MethodEdit.Text;
    Adresse=URIEdit.Text;
    Protokol=ProtocolEdit.Text;
    with(WinHttpRequest){
        open (Method,Protokol + "://" + Adresse,false);
 
        //*******************************************************************//
        //Проверяем, заполнены ли поля
        //*******************************************************************//
        if (HostEdit.Text!="" & Host.Text!="") { SetRequestHeader(HostEdit.Text,Host.Text); }
        if (UserAgentEdit.Text!="" & UserAgent.Text!="") { SetRequestHeader(UserAgentEdit.Text,UserAgent.Text); }
        if (RefererEdit.Text!="" & Referer.Text!="") { SetRequestHeader(RefererEdit.Text,Referer.Text); }
        if (AcceptLanguageEdit.Text!="" & AcceptLanguage.Text!="") { SetRequestHeader(AcceptLanguageEdit.Text,AcceptLanguage.Text); }
        if (XForwardedForEdit.Text!="" & XForwardedFor.Text!="") { SetRequestHeader(XForwardedForEdit.Text,XForwardedFor.Text); }
        if (CookieEdit.Text!="" & Cookie.Text!="") { SetRequestHeader(CookieEdit.Text,Cookie.Text); }
        if (RandomEdit.Text!="" & RandomText.Text!="") { SetRequestHeader(RandomEdit.Text,RandomText.Text); }
        //*******************************************************************//
        try{
            inc=0;
            //Отправляем HTTP запрос
            send(MSG);
        }catch(e){
            if (e!=0){
                msg1="Ошибка!!!\n" + "Код: " + e.number +"\nОписание: " + e.description;
                WScript.echo (msg1);
                e.clear;
                inc=1;
            }
        }
        if (inc==0){
            edit1.Text="";
            edit2.Text="";
            //Выводим сисок всех заголовков HTTP протокола
            ArrList+=WinHttpRequest.getAllResponseHeaders();
            edit1.Text=ArrList;
            //Выводим ответ в виде текста
            edit2.Text=WinHttpRequest.ResponseText();
        }
    }
}

Скачать архив с примером

Хорошо, с программированием закончили, теперь давайте коротко рассмотрим программный код. В самом сценарии есть две пользовательские функции («Урок 3 по JScript — создание пользовательских функций JS«):

Cleare – По сути, просто отвечает за очистку текстовых полей.

Analize – Самая главная функция, так как именно она отправляет HTTP запрос. По сути, тут сначала считываются заголовки HTTP и выбранные методы HTTP протокола. С помощью условного оператора IF («Урок 8 по JScript — условный оператор if…else, арифметические и логические операторы«) происходит проверка содержимого полей. Далее следует отправка HTTP данных, с помощью конструкции TRY … CATCH мы сможем перехватить ошибку, в случает сбоя при отправке данных.

Полагаю, что в остальном, вы и сами сможете разобраться…

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий