Большое количество World Wide Web приложений основано на использовании внешних программ, управляемых Web сервером. Использование данных программ позволяет строить Web приложения с динамически обновляемой информацией, хнанящейся в базах данных или генерирующейся в зависимости от бизнес-правил рещаемых задач. Для связи между Web сервером и вызываемыми программами широко используется Common Gateway Interface (CGI), имеющий реализации как для Windows-ориентированных программ, так и для приложений, функционирующих в среде Unix. Данный документ описывает Windows-модификацию интерфейса CG, иначе называемую Windows CGI интерфейсом.
Разбор данных HTML-форм
Windows CGI требует, чтобы Web сервер декодировал данные из HTML форм, если они переданы при помощи POST метода запроса. Он не требует от сервера декодирования параметров, если они переданы в качестве строки запроса («query string»), являющейся частью URL.
Существует два способа, которыми данные из форм могут быть переданы серверу броузером:
Application server | Протоколы | CGI | WSGI
URL-Encoded
Это наиболее используемый формат данных, передаваемых из форм. Содержимое полей формы выделяются из формы и передаются согласно спецификации HTML 1.0, а затем собираются в одну строку, где отделяются друг от друга символом амперсанда. Тип содержания сообщения устанавливается броузером в application/x-www-form-urlencoded.
Multipart Form Data
Данный формат разработан для эффективной загрузки файлов на сервер с использованием форм. Содержимое полей формы передается как многостраничное MIME сообщение. Каждое поле содержится в одной странице. Тип содержания, устанавливается броузером в multipart/form-data.
«Грамотные» серверы должны уметь обрабатывать оба типа данных из форм.
Вызов CGI программ
Сервер использует функцию CreateProcess() для вызова CGI программ. Сервер синхронизируется с CGI программой, поскольку он должен определить момент завершения CGI программы. Это достигается использованием функции Win32 WaitForSingleObject(), ожидающей получения сигнала завершения CGI программы.
Командная строка
Сервер должен вызывать CGI программу выполняя функцию CreateProcess() с командной строкой следующего формата:
Полный путь к исполняемой CGI программе. Сервер не зависит от «текущего каталога» или переменной окружения PATH. Примите к сведению, что «исполняемая» не обязательно означает .EXE файл. Это может быть документ, ассоциирующийся с реально исполняемой программой, описанной в WIN.INI или System Registry.
Полный путь к CGI файлу данных.
Метод вызова
Сервер использует CreateProcess() для запуска процесса, не имеющего главного окна. Вызванный процесс не будет отображаться каким либо образом на мониторе сервера.
Некоторые сервера поддерживают режим отладки CGI программ и скриптов, что позоволяет серверу запускать CGI программу как обычный процесс с созданием главного окна и отображением информации на мониторе сервера. Данный способ весьма удобен на стадии отладки CGI программ.
Что такое CGI?
CGI файл данных
Сервер передает данные CGI программам через Windows «private profile» afqk, в формате «параметр-значение» (windows INI файл). CGI программа может прочитать данный файл и получит все данные, передаваемые ей из формы, а также автоматически генерируемые броузером данные.
CGI файл данны состоит из следующих секций:
* [CGI]
* [Accept]
* [System]
* [Extra Headers]
* [Form Literal]
* [Form External]
* [Form Huge]
* [Form File]
Данная секция содержит большинство специфических CGI параметров (тип дотупа, тип запроса, дополнительные заголовки, определенные в других секциях и т.п.). Каждое значение представлено ввиде символьной строки. Если значение является пустой строкой, значит данный параметр был опущен. Tсписок параметров данной секции представлен ниже:
Название и модификация информационного протокола, использованного для передачи данного запроса. Формат: протокол/модификация. Пример: «HTTP/1.0».
Метод, который использовался для данного запроса. Для HTTP это «GET», «HEAD», «POST» и т.д.
Логический путь к исполняемой CGI программе, необходимый для ссылки CGI программе на саму себя.
Запрос также может указывать к ресурсам, необходимым для выполнения данного запроса. Данный параметр содержит путь в том виде, который был получен сервером без мэпирования его на физический путь на диске.
Если запрос содержит информацию о логическом пути, сервер преобразует его к физическому пути (например, к пути к файлу на диске) досупа согасно синтаксическим правилам операционной системы.
Информация, размещающаяся после ? в URL вызываемой CGI программы. Сервер оставляет эту информацию без изменений в том виде, в котором она была помещена в URL.
Byte-range спецификация получаемая вместе с запросом (если есть). Смотри текущий Internet Draft (или RFC), описывающий расширение HTTP для получения более полной информации. Сервер должен поддерживать работу CGI программ в byte-ranging.
URL документа, содержащего ссылку на данную CGI программу. Надо заметить, что некоторые броузеры закрывают данную возможность и не дают ее использовать.
E-mail адрес пользователя броузера. Надо заметить, что данный параметр присутствует с спецификации HTTP, но не используется большинством броузером из соображений секретности.
Строка, описывающая программное обеспечение броузера. Не генерируется большинством броузеров.
Как запустить программу cgi
Если у Вас от чего-то все работает, то очень СТРАННО. Как правило новичку, чтобы запустить скрипт приходится попотеть. Какие же основные проблемы возникают при запуске скрипта ?
Настройки сервера
Первой, но не главной причиной может послужить неправильная настройка сервера. Скорее всего попросту он не имеет права запускать скрипты из этой директории. Я всегда рассматриваю только Web-сервер Apache, поэтому приведу настройки для него. Кстати сегодня в ComputerWorld(8.02.2000) опубликовали результаты исследований RUNet’a. Оказалось, что Apache установлен на 78% всех серверов, веб-сервера от Microsoft — 19%, доля остальных серверов составляет по 1%. Так что я опять говорю, лучше Apache Вы не найдете .
Ладно отвлеклись от темы. Все настройки Apache для каждой директории задаются с помощью файла .htaccess. Если такового в вашей директории не имеется, то создавайте его. В него запишите следующее:
Options ExecCGI
Или даже посоветую обратиться к документации, но думаю она не понадобится.
Теперь любые скрипты в этом каталоге будут загружаться без проблем.
Неверные атрибуты на файле скрипта
Если на вашем сервере установлена система подобная Windows, то эта проблема вас не касается, так как все программы *.exe «эта» система загружает без вопросов.
В случае если Ваша система Unix, то вам повезло меньше, особенно если Вы до этого видели только Windows.
В кратце поясню. Во всех системах Unix для каждого файла устанавливаются атрибуты файлов. Этих атрибутов (как правило) девять. Даю список таковых.
Owner Read Owner Write Owner Execute Group Read Group Write Group Execute Other Read Other Write Other Execute
Если кратко, то в Unix системах создаются пользователи и разделяются на группы. Вы вот при входе в систему набираете свой логин и пароль, т.е. Вы являетесь пользователем. Также по FTP и т.д.
Все кто имеет доступ к системе является ее пользователем.
Атрибуты типа Owner задают параметры для Вас, т.е. для владельца файлов. Атрибуты Group определяют уровень доступа для вашей группы, т.е. если Вы принадлежите к группе Webmasters, то при установке атрибута Group Write любой другой пользователь, который принадлежит к группе Webmasters сможет записывать в этот файл информацию. Думаю для чего Other понятно, это значит всем остальным.
При записывании файла через FTP атрибуты файла устанавливаются по умолчанию
rw.r..r..
Т.е. Вы можете писать и читать, а остальные могут только читать. Как видите ни один атрибут не указывает на то, что файл загружаемый. Вы должны добиться такого:
rwxr.xr.x
Т.е. установить атрибут Execute во всех группах.
Как это сделать это другой вопрос, давайте рассмотрим с вами работу с некоторыми FTP клиентами. Сразу скажу, что не использую никакие Виндовые программы, т.е. графические «проги» рассчитанные на любителей делать все одним кликом мыши.
Я пользуюсь нашим, т.е. российским файловым менеджером FAR, если у вас его нет, то Вы много потеряли. И я вам сочувствую.
Так вот в нем надо нажать Ctrl-A на том файле, который Вы закачали на сервер (только делаете это не на локальном диске, а на FTP, а то увидите вместо атрибутов Unix атрибуты Досовской файловой системы) Делаете следующую картинку:
R W X R W X R W X [x][x][x] [x][ ][x] [x][ ][x]
И нажимаете Okey. Теперь все классно.
Если у Вас нет FAR, то у Вас ОБЯЗАНА быть программа в системе, которая занимается сервисом FTP. В большинстве систем (и в Винде) такая программа называется ftp. Запустите ее. Наверняка она обладает только командной строкой, так что потейте. 🙂 Я рассмотрю программу ftp.exe, которая входит в виндовс.
Первое, что надо сделать открыть Ваш сайт, делается это командой open
ftp> open www.mjk.msk.ru Связь с mjk. 220 mjk-gw.mjk.msk.ru FTP server (Version wu-2.4.2-academ[BETA-18](1) Mon Aug 3 19:17:20 EDT 1998) ready. Пользователь (mjk:(none)): dron 331 Password required for dron. Пароль: 230-Please read the file README.linux 230- it was last modified on Sat Feb 5 16:31:50 2000 — 3 days ago 230 User dron logged in. ftp>
Теперь Вы в системе.
Наберите help для получения основных команд. Попробуйте набрать dir. Пример вывода:
200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. total 48 drwx—— 3 dron mjkusers 1024 Feb 6 16:58 . drwxr-xr-x 75 root root 2048 Feb 1 00:03 .. -rw-r—r— 1 dron mjkusers 1155 Jun 24 1999 .Xdefaults -rw——- 1 dron mjkusers 24 Jan 8 11:35 .bash_history -rw-r—r— 1 dron mjkusers 24 Jun 24 1999 .bash_logout -rw-r—r— 1 dron mjkusers 230 Jun 24 1999 .bash_profile -rw-r—r— 1 dron mjkusers 124 Jun 24 1999 .bashrc -rw-r—r— 3 dron mjkusers 1324 Jan 8 11:32 123.cgi -rw-r—r— 1 dron mjkusers 37165 Feb 5 16:31 README.linux 226 Transfer complete. 691 байт получено за 0.33 с (2.09 КБ/с)
Мне например надо теперь установить атрибут загрузки на файл 123.cgi, как видите у него такого атрибута нет. Такую возможность ftp.exe не предоставляет, зато он может посылать команды непосредственно FTP — серверу, т.е. что нам и требуется. Если вы вызывали помощь, то знаете, что такую функцию выполняет команда quote. Чтобы Вам особо не разбираться просто приведу команду.
quote SITE CHMOD 755 123.cgi
Теперь на файле 123.cgi будут установлены необходимые атрибуты. Если Ваш файл располагается в другой директории, то пользуйтесь командой cd (change directory).
Неправильный атрибут на каталоге скрипта
Многие скрипты не только выводят какую-то информацию, но и еще записывают что-то в определенные папки или файлы. Тут надо предусмотреть правильный доступ к этим ресурсам. Любой Web-сервер работает не от вашего имени, а от другого, поэтому запуская скрипт он не предоставляет ему Ваши возможности. Вы должны поставить атрибуты на директорию, в которую записан скрипт, для полного доступа, т.е. для записи всем кому угодно. Для установки таких атрибутов в FAR’е поставьте все крестики. В ftp.exe команда такая
quote SITE CHMOD 777
Хочу Вас также предостеречь, делая полный доступ на директорию помните, что любой «злоумышленник» может вам подпортить жизнь, стереть Ваш скрипт и например записать свой, или записывать неправильные данные в ваши файлы. Короче он может делать, что угодно. Особенно опасно делать полный доступ к директории в которой лежит страничка, потому как рано или поздно вы ее там не обнаружите :-(.
Поэтому СОВЕТ. Создавайте специально для скриптов отдельные каталоги и используйте их для записи данных. А лучше всего делать доступ только отдельному файлу (в этом случае маска доступа не 777, а 666 . ) Причем думаю не плохо было бы позаботиться и о шифровании, т.к. любой скрипт может записывать конфиденциальную информацию, такую как номера кридитных карт, почтовые адреса, имена и фамилии. Любой «спаммер» или «хакер» скажет вам большое спасибо за такой подарок, хотя скорее всего «спасибо» вам скажут «дяди в погонах».
Вобщем-то все, надеюсь у Вас все заработает 🙂
Источник: firststeps.ru
Perl и CGI-программы – особенности использования
Что такое CGI и PERL
Важно понимать, что CGI – не язык программирования, а протокол передачи данных веб-серверу через stdin и их прием из stdout. В качестве обработчика команд используется любая программа с поддержкой функций потокового ввода-вывода. Например, написанная на языке Perl. Главное, что от скрипта требуется «умение» заполнять таблицы в базе данных и получать данные из них путем подачи запроса, чего никогда не сделать средствами HTML.
Особенности применения языка Perl:
- Подходит для парсинга текстовых данных в справочных системах.
- Он удобен при обработке массивов непонятных данных в БД веб-ресурсов.
- Требуется вывод информации на экран, в файл или график на сайте.
В качестве альтернативы Perl все чаще применяется язык программирования Python, но администраторы «старой закалки» продолжают придерживаться классики создания CGI-скриптов, так как поддержка Perl «по умолчанию» имеется в большинстве дистрибутивов Linux. Поэтому программы на нем начинают работать без предварительной подготовки сервера. Формально же скрипты можно писать на чем угодно – хоть на C/C++, Pascal, Java или Visual Basic.
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Использование готовых скриптов
Если CGI-скрипт уже готов (используется стандартный модуль), перед использованием его нужно скопировать на сервер хостинга. Выполняется процедура при помощи файлового менеджера в панели управления или через FTP-доступ, например программой FileZilla. Выбор расположения остается на усмотрение пользователя; к программе можно обращаться независимо от имени каталога или подкаталога, но рекомендуется придерживаться определенных стандартов.
Так, внутри скриптов обязательно указывается путь к интерпретатору используемой платформы для программирования:
- Perl – /usr/bin/perl.
- Python – /usr/local/bin/python.
Если здесь допустить ошибку, программный код исполнятся не будет. То же происходит, если в ПО предусмотрено обращение к базе данных MySQL – пользователю понадобится внести в программу путь к ней, логин и пароль доступа. При изменении последнего корректировка CGI-скрипта обязательна, иначе он перестанет работать. Местоположение файлов в популярных CMS выясняется в службе технической поддержки или в служебной документации.
Написание простейшего CGI-скрипта
При работе в среде операционной системы Windows для написания кода понадобится специальная программа. Например, подойдет специализированный текстовый редактор Notepad++ (стандартный Блокнот для таких целей не подходит). Сам код строится вокруг переменных окружения и потоков ввода-вывода информации. По сути, CGI-скрипты являются обработчиками отдельных команд и не являются «полноценной» программой.
- Стандартный поток ввода (stdin) – скрипт получает информацию с клавиатуры, сокета, из локального (удаленного) файла или из результатов работы основной программы.
- Переменные окружения (Environment Variables) – переменные, требуемые при выполнении кода скрипта. Определяются пользователем или сервером.
- Стандартный поток вывода (stdout) – означает вывод на экран результатов вычислений или их сохранение в файл, передача в сокет, входной поток другой программы или на принтер.
Главное, избегать использования SHELL, который снижает безопасность сайта. В качестве примера простейшего CGI-скрипта приведем код для вывода текущей даты и команду HTML, при помощи которой будет происходить обращение к программе (из любой части страницы, хоть в нескольких местах одновременно).
#!/bin/sh echo Content-type: text/html echo echo «
Today is » date echo «
»
При помощи специального виджета, установленного в CMS, или путем ручного редактирования шаблона в нужный участок HTML вставляется код:
В приведенном примере решена типовая ошибка новичков. Она заключается в отсутствии метки о типе выводимого результата (строка 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: %sttVersion: %sn», $module, $installed->version($module); >
Выйти из файла с сохранением и запустить его на исполнение можно командой perl ./modules.pl. Процедура по поиску подключенных CGI-скриптов востребована, еслина сайте возникают ошибки 403 или 500. Первая появляется из-за некорректной настройки прав доступа (необходимо установить на файлах скриптов доступ 755), вторая же происходит из-за сбоя транслятора Perl или из-за синтаксической/логической ошибки в самом коде. В любом случае сначала нужно убедиться в том, что скрипт подключен.
Источник: timeweb.com