Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Дополнение. Протокол CGI

Протокол SMTP | Протокол IMAP4 | Дополнение. Почтовый сервер изнутри | Дополнение. Анонимная рассылка корреспонденции | Дополнение. Анонимное получение корреспонденции | Атака на почтовый сервер | Атака на почтового клиента | Протокол NNTP | Дополнение. Поиск общедоступных NNTP-серверов | Атака на NNTP-сервер. |


Читайте также:
  1. HART протокол
  2. V. Ресурсне забезпечення виконання протоколу
  3. Базовый протокол устранения проблемы с BSFF
  4. В соответствии с решением приемной комиссии (ПРОТОКОЛ № 8 от 19.08.2013г.) и Правилами приема граждан на обучение в ОГБОУ СПО «Ульяновский строительный колледж» от 06 мая 2013г.
  5. Взаимосвязи между протоколами Internet
  6. Взірець п р о т о к о л у : Протокол № 5
  7. Дерево протоколов

 

Ø В этой главе:

Ø Краткая история создания и развития протокола CGI

Ø Устройство и назначение протокола CGI

Ø Перечень популярных CGI-переменных

 

Вопреки распространенному заблуждению неразрывности HTTP и CGI, последний представляет собой самостоятельный протокол, возникший еще в те незапамятные времена, когда web‑серверов и в помине не существовало.

Первые, робкие попытки использования CGI‑протокола HTTP-серверами относятся к 1993 году, когда возникла необходимость обрабатывать формы, заполняемые пользователем и генерировать динамические страницы, выводящие, например, результаты некоторого поиска.

Традиционный HTML этого делать не умел, о Java еще никто не слышал, поэтому единственным выходом представлялось использование для этой цели внешних программ, написанных, например, на Си и исполняющихся на сервере.

Основная проблема заключалась в стандартизации механизма взаимодействия между клиентом и удаленной программой. Интерфейс CGI занимается ничем иным, как обработкой клиентских запросов и доставкой результатов работы внешних программ.

Техническая реализация этого процесса выглядит следующим образом – каждый раз при запросе на запуск скрипта (смотри методы GET и POST), HTTP‑сервер создает виртуальную среду, в которой выполняется требуемый файл. Обмен данными осуществляется через стандартный ввод‑вывод (тело сообщения) и переменные окружения (HTTP‑заголовок).

Таким образом, стало возможным разрабатывать программы с использованием стандартных библиотек. Все заботы согласования с протоколом взял на себя интерфейс CGI.

Вот неполный список наиболее популярных переменных, в которых сохраняются значения некоторых полей HTTP-заголовка:

 

Переменная Поле HHTP Значение
AUTH_TYPE Authorization Механизм аутентификации
CONTENT_LENGTH Content-Length Длина тела сообщения
CONTENT_TYPE Content-Type Тип данных тела сообщения
QUERY_STRING   Строка параметров ресурса
REMOTE_ADDR   IP адрес клиента[276]
REQUEST_METHOD   Используемый метод (GET, POST…)

 

Все изменения этих переменных будут проигнорированы сервером, поэтому, прежде чем приступить к передаче результатов своей работы, скрипт должен, воспользовавшись стандартным выводом, сформировать HTTP‑заголовок ответа, отделенный от тела сообщения пустой строкой.

Именно для этого в каждый Perl‑скрипт должна быть включена строка ‘print “Content‑type: text/html\n\n”;’, иначе возникнет ошибочная ситуация.

 

Врезка «замечание»

В некоторых ситуациях, динамическая страница не генерируется, а всего лишь перенаправляется запрос на другой сервер или ресурс, изменением поля “Location:” в HTTP-заголовке.

 

Если результатом работы скрипта является двоичный файл солидных размеров, настоятельно рекомендуется включить в заголовок поле “Content‑Length”, чтобы клиентское программное обеспечение могло корректно отображать бегунок прогресса. Сказанное выше справедливо и для обработки пользовательских запросов. Чтобы узнать длину переданных данных, скрипт должен считать переменную CONTENT_LENGTH.

Грубый пример, подпрограммы, читающей запрос пользователя, на языке Си может выглядеть так:

 

· fgets(*buffer,getevn(“CONTENT_LENGTH”),stdin);

 

Широко известный скрипт «test-cgi»[277], является не более чем тривиальным командным файлом для оболочки "sh” (UNIX), который выводит переменные окружения посредством команды «echo».

 

· #!/usr/bin/sh

· echo Content-type: text/plain

· echo

· echo SERVER_SOFTWARE = $SERVER_SOFTWARE

· echo SERVER_NAME = $SERVER_NAME

· echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE

· echo SERVER_PROTOCOL = $SERVER_PROTOCOL

· echo SERVER_PORT = $SERVER_PORT

· echo REQUEST_METHOD = $REQUEST_METHOD

· echo HTTP_ACCEPT = "$HTTP_ACCEPT"

· echo PATH_INFO = $PATH_INFO

· echo PATH_TRANSLATED = $PATH_TRANSLATED

· echo SCRIPT_NAME = $SCRIPT_NAME

· echo QUERY_STRING = $QUERY_STRING

· echo REMOTE_HOST = $REMOTE_HOST

· echo REMOTE_ADDR = $REMOTE_ADDR

· echo REMOTE_USER = $REMOTE_USER

· echo CONTENT_TYPE = $CONTENT_TYPE

· echo CONTENT_LENGTH = $CONTENT_LENGTH

 

 

· SERVER_SOFTWARE = Apache/1.3.12 (Unix) mod_perl/1.22 AuthMySQL Plus/2.20.2 PHP/3.0.14 rus/PL29.4

· SERVER_NAME = kpnc.softclub.net

· GATEWAY_INTERFACE = CGI/1.1

· SERVER_PROTOCOL = HTTP/1.1

· SERVER_PORT = 80

· REQUEST_METHOD = GET

· HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, */*

· PATH_INFO =

· PATH_TRANSLATED =

· SCRIPT_NAME = /cgi-bin/test-cgi

· QUERY_STRING = user=kpnc&pass=salt%20mine

· REMOTE_HOST = ppp-05.krintel.ru

· REMOTE_ADDR = 195.161.41.229

· REMOTE_USER =

· CONTENT_TYPE =

· CONTENT_LENGTH =

 

 

Врезка «замечание»

После сказанного становиться понятно, что термин «CGI-приложения» технически неграмотен. На самом деле следовало бы говорить «приложения, выполняющиеся на удаленной машине и взаимодействующие с клиентом через CGI-интерфейс».

Впрочем, правила CGI не столь строги и достаточно прозрачны, поэтому временами можно забывать какой посредник обеспечивает обмен данными.

 


Дата добавления: 2015-11-14; просмотров: 37 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Протокол HTTP| Дополнение. Язык HTML

mybiblioteka.su - 2015-2024 год. (0.01 сек.)