Разработчики сайтов и администраторы нередко сталкиваются со скриптами CGI (микросценариями обработки текстовых данных). Они применяются при создании интерактивных страниц, содержание которых зависит от действий пользователя. Например, это могут быть формы регистрации или отправки комментариев. Также есть «невидимая» область применения – сбор и обработка информации о посетителях при помощи файлов cookies.
1. Запишите текст примера 15.8 в обозначениях, использующих объектно-ориентированный интерфейс с модулем CGI.
2. Используя модуль CGI, дополните пример 15.8 кодом, осуществляющим проверку введенных данных, как это сделано в примере 15.76.
3. Ниже приведены тексты трех примеров, входящих в отдельный дистрибутив модуля CGI.pm. Разберите, что делают эти сценарии.
- a) clickable_image.cgi
- 6)
quadraphobia.cgi
- в) popup.cgi
- Что такое CGI и PERL
- Спецификация Common Gateway Interface
- Понятие CGI-скрипта
- Типы запросов
- Механизмы приема данных скриптом
- Механизм генерации отклика скриптом
- Программы CGI
- CGI-интерфейс
- Программа CGI
- Perl
- PHP
- Программы CGI
- CGI-интерфейс
- Программа CGI
- Perl
- PHP
- Использование готовых скриптов
- Вопросы для самоконтроля
- Написание простейшего CGI-скрипта
- Просмотр установленных модулей PERL
- Передача информации CGI-программе
Что такое CGI и PERL
Важно понимать, что CGI – не язык программирования, а протокол передачи данных веб-серверу через stdin и их прием из stdout. В качестве обработчика команд используется любая программа с поддержкой функций потокового ввода-вывода. Например, написанная на языке Perl. Главное, что от скрипта требуется «умение» заполнять таблицы в базе данных и получать данные из них путем подачи запроса, чего никогда не сделать средствами HTML.
Особенности применения языка Perl:
- Подходит для парсинга текстовых данных в справочных системах.
- Он удобен при обработке массивов непонятных данных в БД веб-ресурсов.
- Требуется вывод информации на экран, в файл или график на сайте.
В качестве альтернативы Perl все чаще применяется язык программирования Python, но администраторы «старой закалки» продолжают придерживаться классики создания CGI-скриптов, так как поддержка Perl «по умолчанию» имеется в большинстве дистрибутивов Linux. Поэтому программы на нем начинают работать без предварительной подготовки сервера. Формально же скрипты можно писать на чем угодно – хоть на C/C++, Pascal, Java или Visual Basic.
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Основу «всемирной паутины» WWW составляют Web-узлы.
Это компьютеры, на которых выполняется специальная программа — Web-сервер,
ожидающая запроса со стороны клиента на выдачу документа. Документы сохраняются на Web-узле, как правило, в формате HTML. Клиентом Web-сервера является программа-браузер, выполняющаяся на удаленном компьютере, которая осуществляет запрос к Web-серверу, принимает запрошенный документ и отображает его на экране.
Аббревиатура CGI (Common Gateway Interface)
обозначает часть Web-сервера, которая может взаимодействовать с другими программами, выполняющимися на этом же Web-узле. В этом смысле она является шлюзом (gateway —
шлюз) для передачи данных, полученных от клиента, программам обработки — таким, как СУБД, электронные таблицы и др. C GI включает общую среду (набор переменных) и протоколы для взаимодействия с этими программами.
Общая схема работы CGI состоит из следующих элементов.
1. Получение Web-сервером информации от клиента-браузера. Для передачи данных Web-серверу в языке HTML имеется средство, называемое форма.
Форма задается в HTML-документе при помощи тэгов <FORM> . .</FORM> и состоит из набора полей ввода,
отображаемых браузером в виде графических элементов управления: селекторных кнопок, опций, строк ввода текста, управляющих кнопок и т. д. (рис. 15.1).
2. Анализ и обработка полученной информации. Данные, извлеченные из HTML-формы, передаются для обработки CGI-программе. Они не всегда могут быть обработаны CGI-программой самостоятельно. Например, они могут содержать запрос к некоторой базе данных, которую CGI-программа читать «не умеет». В этом случае CGI-программа на основании полученной информации формирует запрос к компетентной программе, выполняющейся на том же компьютере. C GI-программа может быть написана на любом языке программирования, имеющем средства обмена данными между программами. В среде UNIX для этой цели наиболее часто используется язык Perl. Так как UNIX является наиболее популярной операционной системой для Web-серверов, то можно считать Perl наиболее популярным языком CGI-программирования. Программа на языке Perl представляет собой последовательность операторов, которые интерпретатор
языка выполняет при каждом запуске без преобразования исходного текста программы в выполняемый двоичный код. По этой причине CGI-программы называют также CGI-сценариями
или CGI-скрип-тами.
3. Создание нового HTML-документа и пересылка его браузеру.
После обработки полученной информации CGI-программа создает динамический или, как говорят, виртуальный HTML-документ, или формирует ссылку на уже существующий документ и передает результат браузеру.
Спецификация Common Gateway Interface
Данная спецификация определяет стандартный способ обмена данными между прикладной программой и HTTP-сервером. Спецификация была предложена для сервера
и является основным средством расширения возможностей обработки запросов клиентов HTTP-сервером.
В
имеет смысл выделить следующие основные моменты:
- понятие
; - типы запросов;
- механизмы приема данных скриптом;
- механизм генерации отклика скриптом.
Основное назначение
— обработка данных из HTML-форм. В настоящее время область применения
гораздо шире.
Понятие CGI-скрипта
называют программу, написанную на любом языке программирования или командном языке, которая осуществляет обмен данными с HTTP-сервером в соответствии со спецификацией
Common Gateway Interface
.
Наиболее популярными языками для разработки скриптов являются Perl и С.
Типы запросов
Различают два типа запросов к
: по методу и по методу . В свою очередь, запросы по методу подразделяются на запросы по типам кодирования: и , а запросы по методу — и .
В запросах по методу данные от клиента передаются скрипту в переменной окружения . В запросах по методу данные из формы передаются в потоке стандартного ввода скрипта. При передаче через поток стандартного ввода в переменной окружения указывается число передаваемых символов.
Запрос типа — это запрос вида:
http://intuit.ru/somthing-cgi/cgi-script?word1+word2+word3
Главным здесь является список слов после символа «?». Слова перечисляются через символ «» и для кириллицы в шестнадцатеричные последовательности не кодируются. Последовательность слов после символа »
?» будет размещена в переменной окружения .
Запрос типа — это запрос вида:
http://intuit.ru/somthing-cgi/cgi-script?field=word1&field2=word2
Данные формы записываются в виде пар «», которые разделены символом «».
Приведенный пример — это обращение к скрипту по методу . Все символы после «?» попадут в переменную окружения . При этом если в значениях полей появляется кириллица или специальные символы, то они заменяются шестнадцатиричным кодом символа, который следует за символом «».
При обращении к скрипту по методу данные после символа »
?» не будут размещаться в , а будут направлены в поток стандартного ввода скрипта. В этом случае количество символов в потоке стандартного ввода скрипта будет указано в переменной окружения .
При запросе типа применяется составное тело HTTP-сообщения, которое представляет собой данные, введенные в форме, и данные присоединенного внешнего файла. Это тело помещается в поток стандартного ввода скрипта. При этом к данным формы применяется кодирование как в , а данные внешнего файла передаются как есть.
Механизмы приема данных скриптом
Скрипт может принять данные от сервера тремя способами:
- через переменные окружения;
- через аргументы командной строки;
- через поток стандартного ввода.
При описании этих механизмов будем считать, что речь идет об обмене данными с сервером Apache для платформы Unix.
Переменные окружения
При вызове скрипта сервер выполняет системные вызовы и . При этом он создает среду выполнения скрипта, определяя ее переменные. В спецификации
определены 22 переменные окружения. При обращении к скрипту разными методами и из различных контекстов реальные значения принимают разные совокупности этих переменных. Например, при обращении по методу переменная не имеет значения, а по методу — имеет. Другой пример — переменная окружения . При переходе по гипертекстовой ссылке она определена, а если перейти по значению поля или через JavaScript-программу, то определена не будет.
Получить доступ к переменным окружения можно в зависимости от языка программирования следующим образом:
#Perl $a = $ENV{CONTENT_LENGTH}; . // C a = getenv("CONTENT_LENGTH");
В случае доступа к скрипту по методу данные, которые передаются скрипту, размещаются в переменной окружения .
Аргументы командной строки
#Perl foreach $a (@ARGV) { print $a,"\n"; } // C void main(argc,argv) int argc; char *argv[]; { int i; for(i=0;i<argc;i++) { printf("%s\n",argv[i]); } }
В обоих примерах показана распечатка аргументов командной строки для программ на Perl и C соответственно.
Аргументы командной строки появляются только в запросах типа .
Поток стандартного ввода
Ввод данных в скрипт через поток стандартного ввода осуществляется только при использовании метода доступа к ресурсу (скрипту) . При этом в переменную окружения помещается число символов, которое необходимо считать из потока стандартного ввода скрипта, а в переменную окружения помещается тип кодирования данных, которые считываются из потока стандартного ввода.
При посимвольном считывании в C можно применить, например, такой фрагмент кода:
int n; char *buf; n= atoi(getenv("CONTENT_LENGTH")); buf = (char *) malloc(n+1); memset(buf,'\000',n+1); for(i=0;i<n;i++) { buf[i]=getchar(); } free(buf);
В данном фрагменте применено динамическое размещение памяти в скрипте, поэтому при выходе из него память следует освободить. Вообще говоря, память будет автоматически освобождена операционной системой после завершения скрипта. Однако, если переносить скрипт на спецификацию FCGI (Fast CGI), что требует минимума переделок, из-за неаккуратной работы с памятью могут возникнуть проблемы.
Механизм генерации отклика скриптом
Существует только один способ вернуть данные серверу и, соответственно, браузеру пользователя — писать в поток стандартного вывода (STDOUT). При этом скрипт должен формировать HTTP-сообщение.
Сначала выводятся директивы HTTP-заголовка. В минимальном варианте это либо
Location: http://intuit.ru/
В первом случае определяется тип тела HTTP-сообщения, а во втором осуществляется перенаправление запроса.
После заголовка генерируется отклик в виде тела HTTP-сообщения, которое должно быть отделено от заголовка пустой строкой:
#!/bin/sh echo Content-type: text/plain echo echo Hello
В данном случае используется командный интерпретатор sh.
Если скрипт начинает формирование заголовка с директивы версии HTTP-протокола, то сервер не анализирует отклик и передает его как есть. Если в заголовке, сгенерированном скриптом, эта директива отсутствует, то сервер считает, что заголовок неполный, и вставляет в него дополнительные директивы.
Лекция посвящена способам организации активных web-серверов, формированию динамических документов HTML с помощью CGI, языкам Perl, PHP. Рассматриваются приложения ISAPI и их использование для формирования динамических документов. Рассказывается про среду ASP и ASP. NET.
Программы CGI
CGI-интерфейс
-интерфейс (
Common Gateway Interface
– Общий шлюзовой интерфейс) — одно из первых решений, созданных для доставки динамической web-информации.
он до сих пор очень популярен на платформе UNIX.
-приложения — это программы, исполняемые на Web-сервере и обычно используемые для предоставления динамической Web-информации.
Аббревиатура
(
Common Gateway Interface
) обозначает часть Web-сервера, которая может взаимодействовать с другими программами, выполняющимися на этом же Web-узле, и в этом смысле является
(
—
) для передачи данных, полученных от клиента, программам обработки, таким как СУБД, электронные таблицы, и др.
включает общую среду (набор переменных) и протоколы для взаимодействия с этими программами. Программы
пользуются этим интерфейсом для получения (через протокол HTTP) информации от пользователя, для ее обработки и отправки обратно в виде нового документа HTML, ссылки на существующий документ или на другой объект.
Программа CGI
Программа
это обычное
, работающее в среде операционной системы сервера Web и осуществляющее
через
стандартные потоки ввода
и вывода. Такое приложение загружается в
сервера и запускается только по явному запросу пользователя, когда к нему выполняется обращение из документа HTML. Окончив обработку запроса пользователя, программа
завершает свою работу и выгружается из памяти сервера.
Программа
работает на сервере как отдельный процесс. В рамках этого процесса она способна, в частности, обращаться к базам данных для выборки или обновления информации.
Последовательность работы
состоит из следующих этапов:
- Получение Web-сервером информации от клиента-браузера. Для передачи данных Web-серверу используются формы. Форма задается в HTML-документе при помощи тэгов и состоит из набора полей ввода, отображаемых браузером в виде графических элементов управления: селекторных кнопок, опций, строк ввода текста, управляющих кнопок и т. д. Обычно одна из кнопок предназначена для завершения ввода. Когда пользователь заполнит всю форму, он нажимает эту кнопку, и данные из полей формы передаются программе
. - Анализ и обработка полученной информации. Данные, извлеченные из
, передаются для обработки
-программе. Они не всегда могут быть обработаны
-программой самостоятельно. Например, они могут содержать запрос к базе данных. В этом случае
-программа на основании полученной информации формирует запрос к ядру СУБД, выполняющейся на том же или удаленном компьютере. - Создание нового HTML-документа и пересылка его браузеру. После обработки полученной информации
-программа создает динамический (виртуальный) HTML-документ, или формирует ссылку на уже существующий документ и передает результат браузеру.
программа, имеет свою специфику, заключающуюся в том, что она, как правило, генерирует HTML-документ, посылаемый клиенту в виде ответа сервера. Ответ сервера, так же как и запрос клиента, имеет определенную структуру. Он состоит из следующих трех частей:
- Строка состояния, содержащая три поля: номер версии протокола HTTP, код состояния и краткое описание состояния, например:
НТТР/1.0 200 ОК # Запрос клиента обработан успешно НТТР/1.0 404 Not Found # Документ по указанному адресу не существует
- Заголовки ответа, содержащие информацию о сервере и о возвращаемом HTML-документе, например:
Date: Mon, 26 Jul 1999 18:37:07 GMT # Текущая дата и время Server: Apache/1.3.6 # Имя и номер версии сервера Content-type: text/html # Описывает медиа-тип содержимого
- Содержимое ответа — HTML-документ, являющийся результатом выполнения
-программы.
-программа передает результат своей работы — HTML-документ — серверу, который возвращает его клиенту.
осуществляет свой вывод в
стандартный поток вывода
. Этот вывод может представлять собой или документ, сгенерированный
, или инструкции серверу, где получить необходимый документ. При этом сервер не анализирует и не изменяет полученные данные, он может только дополнять их некоторыми заголовками, содержащими общую информацию (например, текущая дата и время) и информацию о самом себе (например, имя и версия сервера).
В зависимости от метода данные формы передаются в
-программу или через
( ), или через
( ). Помимо этих данных
-программе доступна и другая информация, поступившая от клиента в заголовках запроса или предоставленная Web-сервером.
Информация шлюзам передается в следующей форме:
имя=значение&имя1=значение1&,
где имя- имя переменной (из оператора , например), и значение — ее
. В зависимости от метода, который используется для запроса, эта строка появляется или как часть URL (в случае метода ), или как содержимое HTTP запроса (метод ). В последнем случае, эта информация будет послана шлюзу в стандартный поток ввода.
Данные формы поступают в
-программу в закодированном виде, поэтому в качестве первого шага обработки
-сценарий должен выполнить
полученной информации.
Таким образом,
данных сводится к следующей последовательности манипуляций со строкой:
- замена каждой группы , состоящей из шестнадцатеричного ASCII-кода с префиксом %, на соответствующий ASCII-символ;
- замена символов + пробелами;
- выделение отдельных пар , разделенных ограничителем ;
- выделение из каждой пары имя— значение имени и значения соответствующего поля формы.
Perl
-программа может быть написана на любом языке программирования, имеющем средства обмена данными между программами.
Для создания абсолютно мобильных программ
лучше всего воспользоваться языком Perl. Интерпретаторы этого языка созданы практически для всех операционных систем. Этот
язык высокого уровня
содержит многие функции, упрощающие создание программ
. В сети Internet доступны (причем бесплатно) версии интерпретатора Perl для различных платформ (в том числе и для Microsoft
), разнообразная документация и примеры программ.
Программа на языке Perl представляет собой
, которые интерпретатор языка выполняет при каждом запуске без преобразования исходного текста программы в выполняемый двоичный код. По этой причине
-программы называют также
-сценариями или
.
PHP
Для динамического формирования документов HTML используется также технология PHP (
). P HP часто еще называют
(
). По сути PHP серверный (выполняющийся на стороне сервера) мультиплатформный язык описания сценариев, встраиваемый непосредственно в HTML-код.
Основными сферами применения данной технологии являются создание
и интерфейсов к базам данных.
Приложения PHP встраиваются в документы HTML в качестве сценариев, подобно сценариям JavaScript, однако, в отличие от JavaScript, сценарии PHP выполняются не
, а специальной программой – проигрывателем сценариев PHP, которая является приложением
и запускается сервером. Пользовательский агент получает результат выполнения запрошенного им сценария и не может получить доступ к исходному коду самого сценария.
До того, как сервер пересылает опубликованный файл браузеру, его просматривает препроцессор-интерпретатор. Для этого файлы имеют специальное расширение .phtml или
. Если страница содержит помимо HTML php-код, то он выполняется и результат отправляется браузеру.
Преимуществами PHP является бесплатность и
. Недостаток – плохая масштабируемость. P HP непригоден для использования в сложных проектах. Это связано со следующими особенностями:
- падение производительности при обработке больших скриптов;
- PHP – интерпретируемый язык и уступает по скорости работы компилируемым технологиям;
- в
нет поддержки сессий, как, например, в ASP.
Лекция посвящена способам организации активных web-серверов, формированию динамических документов HTML с помощью CGI, языкам Perl, PHP. Рассматриваются приложения ISAPI и их использование для формирования динамических документов. Рассказывается про среду ASP и ASP. NET.
Программы CGI
CGI-интерфейс
-интерфейс (
Common Gateway Interface
– Общий шлюзовой интерфейс) — одно из первых решений, созданных для доставки динамической web-информации.
он до сих пор очень популярен на платформе UNIX.
-приложения — это программы, исполняемые на Web-сервере и обычно используемые для предоставления динамической Web-информации.
Аббревиатура
(
Common Gateway Interface
) обозначает часть Web-сервера, которая может взаимодействовать с другими программами, выполняющимися на этом же Web-узле, и в этом смысле является
(
—
) для передачи данных, полученных от клиента, программам обработки, таким как СУБД, электронные таблицы, и др.
включает общую среду (набор переменных) и протоколы для взаимодействия с этими программами. Программы
пользуются этим интерфейсом для получения (через протокол HTTP) информации от пользователя, для ее обработки и отправки обратно в виде нового документа HTML, ссылки на существующий документ или на другой объект.
Программа CGI
Программа
это обычное
, работающее в среде операционной системы сервера Web и осуществляющее
через
стандартные потоки ввода
и вывода. Такое приложение загружается в
сервера и запускается только по явному запросу пользователя, когда к нему выполняется обращение из документа HTML. Окончив обработку запроса пользователя, программа
завершает свою работу и выгружается из памяти сервера.
Программа
работает на сервере как отдельный процесс. В рамках этого процесса она способна, в частности, обращаться к базам данных для выборки или обновления информации.
Последовательность работы
состоит из следующих этапов:
- Получение Web-сервером информации от клиента-браузера. Для передачи данных Web-серверу используются формы. Форма задается в HTML-документе при помощи тэгов и состоит из набора полей ввода, отображаемых браузером в виде графических элементов управления: селекторных кнопок, опций, строк ввода текста, управляющих кнопок и т. д. Обычно одна из кнопок предназначена для завершения ввода. Когда пользователь заполнит всю форму, он нажимает эту кнопку, и данные из полей формы передаются программе
. - Анализ и обработка полученной информации. Данные, извлеченные из
, передаются для обработки
-программе. Они не всегда могут быть обработаны
-программой самостоятельно. Например, они могут содержать запрос к базе данных. В этом случае
-программа на основании полученной информации формирует запрос к ядру СУБД, выполняющейся на том же или удаленном компьютере. - Создание нового HTML-документа и пересылка его браузеру. После обработки полученной информации
-программа создает динамический (виртуальный) HTML-документ, или формирует ссылку на уже существующий документ и передает результат браузеру.
программа, имеет свою специфику, заключающуюся в том, что она, как правило, генерирует HTML-документ, посылаемый клиенту в виде ответа сервера. Ответ сервера, так же как и запрос клиента, имеет определенную структуру. Он состоит из следующих трех частей:
- Строка состояния, содержащая три поля: номер версии протокола HTTP, код состояния и краткое описание состояния, например:
НТТР/1.0 200 ОК # Запрос клиента обработан успешно НТТР/1.0 404 Not Found # Документ по указанному адресу не существует
- Заголовки ответа, содержащие информацию о сервере и о возвращаемом HTML-документе, например:
Date: Mon, 26 Jul 1999 18:37:07 GMT # Текущая дата и время Server: Apache/1.3.6 # Имя и номер версии сервера Content-type: text/html # Описывает медиа-тип содержимого
- Содержимое ответа — HTML-документ, являющийся результатом выполнения
-программы.
-программа передает результат своей работы — HTML-документ — серверу, который возвращает его клиенту.
осуществляет свой вывод в
стандартный поток вывода
. Этот вывод может представлять собой или документ, сгенерированный
, или инструкции серверу, где получить необходимый документ. При этом сервер не анализирует и не изменяет полученные данные, он может только дополнять их некоторыми заголовками, содержащими общую информацию (например, текущая дата и время) и информацию о самом себе (например, имя и версия сервера).
В зависимости от метода данные формы передаются в
-программу или через
( ), или через
( ). Помимо этих данных
-программе доступна и другая информация, поступившая от клиента в заголовках запроса или предоставленная Web-сервером.
Информация шлюзам передается в следующей форме:
имя=значение&имя1=значение1&,
где имя- имя переменной (из оператора , например), и значение — ее
. В зависимости от метода, который используется для запроса, эта строка появляется или как часть URL (в случае метода ), или как содержимое HTTP запроса (метод ). В последнем случае, эта информация будет послана шлюзу в стандартный поток ввода.
Данные формы поступают в
-программу в закодированном виде, поэтому в качестве первого шага обработки
-сценарий должен выполнить
полученной информации.
Таким образом,
данных сводится к следующей последовательности манипуляций со строкой:
- замена каждой группы , состоящей из шестнадцатеричного ASCII-кода с префиксом %, на соответствующий ASCII-символ;
- замена символов + пробелами;
- выделение отдельных пар , разделенных ограничителем ;
- выделение из каждой пары имя— значение имени и значения соответствующего поля формы.
Perl
-программа может быть написана на любом языке программирования, имеющем средства обмена данными между программами.
Для создания абсолютно мобильных программ
лучше всего воспользоваться языком Perl. Интерпретаторы этого языка созданы практически для всех операционных систем. Этот
язык высокого уровня
содержит многие функции, упрощающие создание программ
. В сети Internet доступны (причем бесплатно) версии интерпретатора Perl для различных платформ (в том числе и для Microsoft
), разнообразная документация и примеры программ.
Программа на языке Perl представляет собой
, которые интерпретатор языка выполняет при каждом запуске без преобразования исходного текста программы в выполняемый двоичный код. По этой причине
-программы называют также
-сценариями или
.
PHP
Для динамического формирования документов HTML используется также технология PHP (
). P HP часто еще называют
(
). По сути PHP серверный (выполняющийся на стороне сервера) мультиплатформный язык описания сценариев, встраиваемый непосредственно в HTML-код.
Основными сферами применения данной технологии являются создание
и интерфейсов к базам данных.
Приложения PHP встраиваются в документы HTML в качестве сценариев, подобно сценариям JavaScript, однако, в отличие от JavaScript, сценарии PHP выполняются не
, а специальной программой – проигрывателем сценариев PHP, которая является приложением
и запускается сервером. Пользовательский агент получает результат выполнения запрошенного им сценария и не может получить доступ к исходному коду самого сценария.
До того, как сервер пересылает опубликованный файл браузеру, его просматривает препроцессор-интерпретатор. Для этого файлы имеют специальное расширение .phtml или
. Если страница содержит помимо HTML php-код, то он выполняется и результат отправляется браузеру.
Преимуществами PHP является бесплатность и
. Недостаток – плохая масштабируемость. P HP непригоден для использования в сложных проектах. Это связано со следующими особенностями:
- падение производительности при обработке больших скриптов;
- PHP – интерпретируемый язык и уступает по скорости работы компилируемым технологиям;
- в
нет поддержки сессий, как, например, в ASP.
Использование готовых скриптов
Если CGI-скрипт уже готов (используется стандартный модуль), перед использованием его нужно скопировать на сервер хостинга
. Выполняется процедура при помощи файлового менеджера в панели управления или через FTP-доступ, например программой FileZilla
. Выбор расположения остается на усмотрение пользователя; к программе можно обращаться независимо от имени каталога или подкаталога, но рекомендуется придерживаться определенных стандартов.
Так, внутри скриптов обязательно указывается путь к интерпретатору используемой платформы для программирования:
- Perl – /usr/bin/perl.
- Python – /usr/local/bin/python.
Вопросы для самоконтроля
- Что обозначает аббревиатура CGI?
- Что такое Web-сервер?
- Что такое клиент Web-сервера?
- Для чего нужна HTML-форма?
- Какую первую строку должна выводить CGI-программа?
- Какие методы передачи данных формы Web-серверу вы знаете? В чем их особенности?
- Перечислите элементы управления, которые может содержать форма.
- Как кодируется информация, передаваемая CGI-программе?
- В чем заключается специфика CGI-сценариев?
- Каким образом CGI-программа имеет доступ к переменным среды CGI?
- Какая информация содержится в переменной среды QUERY_STRING?
- Для чего предназначен модуль CGI.pm?
Написание простейшего CGI-скрипта
При работе в среде операционной системы Windows для написания кода понадобится специальная программа. Например, подойдет специализированный текстовый редактор Notepad++ (стандартный Блокнот для таких целей не подходит). Сам код строится вокруг переменных окружения и потоков ввода-вывода информации. По сути, CGI-скрипты являются обработчиками отдельных команд и не являются «полноценной» программой.
- Стандартный поток ввода (stdin) – скрипт получает информацию с клавиатуры, сокета, из локального (удаленного) файла или из результатов работы основной программы.
- Переменные окружения (Environment Variables) – переменные, требуемые при выполнении кода скрипта. Определяются пользователем или сервером.
- Стандартный поток вывода (stdout) – означает вывод на экран результатов вычислений или их сохранение в файл, передача в сокет, входной поток другой программы или на принтер.
Главное, избегать использования SHELL, который снижает безопасность сайта. В качестве примера простейшего CGI-скрипта приведем код для вывода текущей даты и команду HTML, при помощи которой будет происходить обращение к программе (из любой части страницы, хоть в нескольких местах одновременно).
#!/bin/sh echo Content-type: text/html echo echo "<h2>Today is " date echo "</h2>"
При помощи специального виджета, установленного в CMS, или путем ручного редактирования шаблона в нужный участок HTML вставляется код:
<a href="/cgi-bin/examples/today.cgi">
В приведенном примере решена типовая ошибка новичков. Она заключается в отсутствии метки о типе выводимого результата (строка Content-type: text/html
). После нее располагается пустая строка для указания, что следом идет непосредственно программный код.
Просмотр установленных модулей PERL
Проверить ранее подключенные PERL-модули можно командой vim
. Перед ее вводом необходимо подключиться к серверу хостинга по защищенному каналу SSH
. После авторизации нужно ввести в консоли:
vim modules.pl
В результате будет создан файл с указанным названием. Следующий шаг – открыть его в текстовом редакторе и изменить содержимое на следующий код:
#!/usr/bin/perl -w use ExtUtils::Installed; $installed = ExtUtils::Installed->new(); foreach $module ($installed->modules()){ printf "Module: %s\t\tVersion: %s\n", $module, $installed->version($module); }
Выйти из файла с сохранением и запустить его на исполнение можно командой perl ./modules.pl
. Процедура по поиску подключенных CGI-скриптов востребована, еслина сайте возникают ошибки 403
или 500
. Первая появляется из-за некорректной настройки прав доступа (необходимо установить на файлах скриптов доступ 755), вторая же происходит из-за сбоя транслятора Perl или из-за синтаксической/логической ошибки в самом коде. В любом случае сначала нужно убедиться в том, что скрипт подключен.
Передача информации CGI-программе
Как мы уже знаем, существуют два метода кодирования информации, содержащейся в форме: стандартный метод application/x-www-form-urlencoded,
используемый по умолчанию, и дополнительный multipart/form-data.
Второй метод нужен только в том случае, если к содержимому формы присоединяется локальный файл, выбранный при помощи элемента формы < INPUT TYPE=FILE> В остальных случаях следует использовать метод кодирования по умолчанию.
Схема кодирования application/x-www-form-urlencoded
одинакова для обоих методов пересылки GET и POST и заключается в следующем.
Для каждого элемента формы, имеющего имя, заданное атрибутом МИМЕ, формируется пара «name=value»,
где value
— значение элемента, введенное пользователем или назначенное по умолчанию. Если значение отсутствует, соответствующая пара имеет вид «пате—’.
Для радиокнопок и переключателей используются значения только выбранных элементов. Если элемент выбран, а значение атрибута VALUE не определено, по умолчанию используется значение «ON».
Все пары объединяются в строку, в качестве разделителя служит символ & Так как имена и значения представляют собой обычный текст, то они могут содержать символы, недопустимые в составе URL (метод GET пересылает данные как часть URL). Такие символы заменяются последовательностью, состоящей из символа % и их шестнадцатеричного ASCII-кода. Символ пробела может заменяться не только кодом %20, но и знаком + (плюс). Признак конца строки, встречающийся в поле TEXTAREA, заменяется кодом %OD%OA. Такое кодирование называется URL-кодированием.
Закодированная информация пересылается серверу одним из методов GET или POST. Основное отличие заключается в том, как метод передает информацию CGI-программе.
При использовании метода GET данные формы пересылаются серверу в составе URL запроса, к которому добавляются после символа ? (вспомним, что запрос — это формализованный способ обращения браузера к Web-серверу). Тело запроса в этом случае является пустым. Для формы из примера 15.1 запрос выглядит следующим образом:
GET /cgi-bin/registrar.cgi? regname = bobSpasswordl = rumataSpassword2 = rumata&age = lt20&language = russian&format = HTML&wish = %F6%C5%CC%Dl%DA%CE%D9 HTTP/1.0
(заголовки запроса, сообщающие серверу, информацию о клиенте) <пусто> (тело запроса)
Часть URL после символа «?» называется строкой запроса.
Web-сервер, получив запрос, присвоит переменной среды QUERY_STRING значение строки запроса и вызовет CGI-программу, обозначенную в первой части URL до символа «?»: /cgi-bin/registrar.cgi. CGI-Программа
registrar.cgi сможет затем обратиться к переменной QUERY_STRING для обработки закодированных в ней данных.
Обратите внимание на то, что данные, введенные в поле типа PASSWORD, передаются открытым текстом без шифрования. При передаче данных методом GET они в составе URL помещаются в файл регистрации доступа access.log, обычно открытый для чтения всем пользователям. Таким образом «секретные» данные, введенные в поле типа PASSWORD, оказываются доступными посторонним.
К сожалению, эта информацдагявдяется статической. Форма же позволяет менять данные.
Строка запроса — не единственный способ передачи данных через URL. Другим способом является дополнительная информация о пути (extra path information),
представляющая собой часть URL, расположенную после имени CGt-программы. Сервер выделяет эту часть и сохраняет ее в переменной среды PATH_INFO. C GI-программа может затем использовать эту переменную для извлечения данных. Например, URL
http://www.domain/cgi-bin/registrar.cgi/4>regname = bobspasswordl
= rumataspassword2 = r\amata&age = lt20&language
= 4>russian&format = HTML&wish = %F6%C5%CC%Dl%DA%CE%D9
содержит уже знакомые нам данные, но не в виде строки запроса, а
в виде дополнительной информации о пути.
При получении запроса с таким URL сервер сохранит данные в переменной среды
PATH_INFO = /regname = bobspasswordl = rumataspassword2 = rumata&age = lblt20&language = russian&format = HTML&wish = %F6%C5%CC%Dl%DA%CE%D9"
Название объясняется тем, что обычно этим способом передается информация о местоположении какого-либо файла (extra path information).
Например, URL
содержит дополнительную информацию PATH_iNFO=/texts/jdk_doc.txt» о местонахождении файла jdk_doc.txt относительно корневого каталога дерева документов. Другая переменная среды PATHJTRANSLATED содержит информацию об абсолютном местоположении файла в файловой системе, например,
а переменная DOCUMENT_ROOT содержит путь к корневому каталогу дерева документов, В нашем случае DOCUMENT_ROOT=»/home/httpd/docs/».
При использовании метода POST данные формы пересылаются серверу в теле запроса. Если в примере 15.1 вместо метода GET использовать метод POST
<form method="post" action="/cgi-bin/registrar.cgi">,
то запрос клиента будет иметь следующий вид:
POST /cgi-bin/registrar.cgi HTTP/1.1
(заголовки запроса, сообщающие серверу информацию о клиенте)
В этом фрагменте среди прочих заголовков выделен заголовок content-length, сообщающий серверу количество байт, переданных в теле запроса. Это значение сервер присваивает переменной среды CONTENT_LENGTH, а данные посылает в стандартный ввод CGI-программы.
Методы GET и POST имеют свои достоинства и недостатки. Метод GET обеспечивает лучшую производительность при пересылке форм, состоящих из небольшого набора коротких полей. При пересылке большого объема данных следует использовать метод POST, так как браузер или сервер могут накладывать ограничения на размер данных, передаваемых в составе URL, и отбрасывать часть данных, выходящую за границу. Метод POST, к тому же, является более надежным при пересылке конфиденциальной информации.