Int Size;
Size = atoi(getenv("CONTENT_LENGTH")); //получить длину строки
char szBuf[8196];
fread(szBuf, Size, 1, stdin); //прочитать полученные данные
Метод GET применяется относительно редко (длина строки QUERY_STRING ограничена), метод POST более предпочтителен.
Вне зависимости от примененного метода передачи данных (GET или POST) результат своей работы программа CGI должна направлять в стандартный поток вывода stdout (при этом WWW-сервер гарантирует возврат данных броузеру локального компьютера). Ниже приведен пример динамической генерации CGI-программой документа HTML и направления его на stdout
printf("Content-type: text/html\n\n"); //упрощенный пролог HTML
printf("<!DOCTYPE HTML PUBLIC \""-//W3C//DTD HTML 3.2//EN\"">");
printf("<HTML><HEAD>
<TITLE>My first dinamic HTML-page</TITLE>
</HEAD><BODY>");
printf("<H1>Результаты обработки данных формы:</H1>");
printf("</BODY></HTML>");
После получения возвращаемых HTML-данных они интерпретируются броузером. При нежелании генерировать сложный HTML-код подобным (весьма кропотливым) образом можно применить метод создания шаблона HTML-файла с последующей программной его модификацией и записью в stdout.
При использовании CGI-программ через (другие) переменные среды (а их несколько десятков) передается большое количество очень важной информации, которая может существенно помочь программисту.
Заметим, что с помощью CGI-программ легко реализуются, например, счетчики числа посещений страниц; в качестве языка программирования CGI-программ часто используют интерпретатор языка Perl (Practical Extraction and Report Language, иногда в шутку Pathologically Eclectic Rubbish Lister, см. InterNet-адреса www.perl.com, www.cpan.org, orwant.www.media.mit.edu/the_perl_journal, www.tpj.com), хотя может быть применен практически любой язык программирования (особенно удобен C/C++). Например, в работе приведены исходные тексты CGI-приложений на языке Java, в] - на языке Perl; на WEB-сайте автора данной работы pilger.mgapi.eduреализована простая гостевая книга с применением Perl.
Недостатком приложений CGI является то, что для обработки каждого запроса WWW-сервером он запускает новое CGI-приложение (новый процесс), а т.к. современные сервераодновременно могут обрабатывать много запросов, ресурсы машины-сервера (например, объем оперативной памяти) быстро истощаются (не говоря уже о снижении производительности сервера). От подобного недостатка свободен метод ISAPI, основанный на обработке запросов динамически загружаемыми (из DLL-библиотек) функциями (недостаток - т.к. ISAPI-расширение выполняется в том же адресном пространстве, что и сам WEB-сервер, критическая ошибка ISAPI-приложения обычно вызывает крах сервера). В отличие от CGI, ISAPI-приложение получает данные не из стандартного потока, а с помощью специально предназначенной для этого функции интерфейса ISAPI; вместо стандартного потока вывода также применяется специальная функция [15].
Некоторые сервера (например, Apache) содержат встроенный Perl, при этом для каждого поступающего CGI-запроса сервер создает новый поток (вместо нового процесса); это значительно ускоряет выполнение CGI-запросов указанным сервером. Для работы под Windows’NT разработаны (см. www.activeware.com) пакеты PerlScript (разработка сценариев ActiveX) и PerlIS (динамически вызываемая библиотека ISAPI-интерфейса [20].
Известны как расширения ISAPI (по функциям аналогичны CGI-расширениям сервера), так и фильтры ISAPI (фактически являющиеся брандмауэрами, применяются для шифрования или перекодировки проходящих через сервер данных, компрессии информации, сбора статистических данных о пользователях, проверки прав доступа и др.).
При использования метода ISAPI имя соответствующего DLL-файла описывается в параметре ACTION формы (аналогично CGI), также описывается параметр METHOD, однако сами присланные на сервер данные могут быть получены с помощью специально зарезервированных функций GetServerVariable (чтение значений переменных среды) и ReadClient (собственно чтение присланных данных), отсылка же данных (как и при использовании CGI, обычно в виде динамически создаваемых HTML-файлов) производится функциями WriteClient и ServerSupportFunction.
Желающим более подробно ознакомиться с возможностями серверных расширений CGI и ISAPI рекомендуются работы [6,15,19].
Заметим, что CGI- и ISAPI-программы потенциально являются источниками снижения безопасности функционирования WEB-серверов. Например, можно советовать работу для ознакомления с началами обеспечения безопасности выполнения CGI-сценариев на Perl; ниже приведено несколько WEB-адресов, посвященных проблеме безопасности
· www.w3.org/Security/Faq/www-security-faq.html
· www.perl/com/CPAN-local/doc/FAQs/cgi/perl-cgi-faq.html
· stars.com/Authoring/Scripting/Sequrity
· www.go2net.com/people/paulp/cgi-sequrity/safe-cgi.txt
Мощным средством для упрощения процесса реализации функциональности и расширения возможностей технологии CGI является язык PHP/FI (Персональные инструментальные средства для Домашней Страницы / Интерпретатор Форм), предложения которого встраиваются непосредственно в текст HTML-страницы и выполняются процессом, инициализированным сервером (обычно Apache). PHP/FI существенно упрощает обработку запросов от форм и анализ SQL-запросов, допускает добавление пользовательских функций (обычно написанных на C). Использование PHP/FI повышает эффективность обработки запросов (CGI-программа не стартует, PHP/FI-код выполняется одним из серверных процессов), при этом повышается уровень защиты данных и конфигурируемость серверного ПО. Первым признаком того, что страница обрабатывается PHP/FI, является добавление нижнего колонтитула с информацией о количестве обращений к данной странице (если программа скомпилирована с опцией регистрации доступа).
Лекция
Дата добавления: 2015-09-14; просмотров: 779;