Наръчник за писане на CGI скриптове

http://www.slac.stanford.edu/~cottrell/icons/slaclogo.gif Наръчник за писане на CGI скриптове в REXX и Perl
Последно обновяване 24 Юли 1998 година.


SLAC Utilities | CGI-lib.rxx | Security Wrapper | съображения за сигурност | ]


Съдържание


Въведение

Настоящото ръководство е насочена към хора, които желаят да пишат свои WWW изпълними скриптове използвайки WWW е Common Gateway Interface ( CGI ). Въпреки че основният акцент е върху Rexx много примери, са дадени също в Perl.

Има няколко прости софтуерни библиотеки, за да се улесни писането на CGI скриптове. CGI-lib.rxx е REXX библиотека от функции (на разположение на SLAC с помощта на REXX 

CALL PUTENV "REXXPATH = / AFS / SLAC / WWW / SLAC / WWW / инструмент / CGI-REXX" 

декларация за включване на библиотеката по време на изпълнение) и CGI-lib.pl е подобна библиотека в Perl, написана от Стив Brenner (там е изпълним копие от това libary в SLAC в / AFS / SLAC / ж / WWW / CGI-ИЪ / CGI-lib.pl). NCSA е много полезен набор от Perl CGI товарач подпрограми, които са достъпни чрез анонимен FTP . Друг набор от Perl CGIстрана на сървъра скриптове , написани от Brigitte Йелинек е достъпен под Gnu Public License. Налице е и кода Източник за www.stanford.edu скриптове и програми . Има и форум за Perl WWW програми , събрана от Earl Hood. Накрая вижте Центъра за развитие Web .

Тъй като има сигурност и други рискове, свързани с изпълнение на потребителски скриптове в WWW сървър, читателят може да пожелае да първи оглед на документ за предоставяне на информация за SLAC Security Wrapper за потребителите CGI скриптове. Освен подобряването на сигурността, тази обвивка също опростява задачата на написването на CGI скрипт за начинаещи.

Преди да се впусне в написването на сценария, може също да искате да се провери някои груби забележки за SLAC Уеб помощните средства, осигурени от CGI скриптове .

The CGI е интерфейс за управлението на външни програми или портали, по силата на информация за сървъра. В момента поддържаните информационни сървърите са HTTP(Протокол за транспорта, използван от WWW) сървъри.

Gateway програми са изпълними програми (напр. UNIX скриптове), които могат да се изпълняват от самите тях (но не биха искали да направят изключение за целите на отстраняване на грешки). Те са направени изпълним за да им позволи да се движат при различни (вероятно много по-различна) информационни сървъри взаимозаменяемо. Gateway програми, съответстващи на тази спецификация могат да бъдат написани на всеки език, включително REXX или Perl, която произвежда един изпълним файл

Първи приноса към Script

Входът може да бъде изпратена към скрипта по няколко начина в зависимост от Uniform Resource Locator на клиента ( URL ) или HyperText Markup Language ( HTML ) Форма :

QUERY_STRING се определя като нещо, което следва първо? в URL адреса, използван за достъп до вашата врата. Тази информация може да бъде добавена чрез документ HTML ISINDEX, или от HTML форма (с действието GET). Той също така може да бъде ръчно вградени в хипервръзка HTML, или котва, която препраща вашата врата. Този низ ще бъде обикновено заявка за информация, като например това, което потребителят иска да търси в бази данни, или може би най-кодирани резултатите от вашата форма за обратна връзка. Тя може да бъде достъпен в REXX с помощта String=GETENV('QUERY_STRING') 

или в Perl, като използвате $string=$ENV('QUERY_STRING');

Този низ е кодирана в стандартния URL формат, който променя пространства да +, и кодиране на специални символи с хх% шестнадесетичен кодиране. Вие ще трябва да се декодира, за да го използвам. Можете да прегледате CGI-lib.rxx ПРОЦЕДУРА REXX на DeWeb или Perl код фрагмент дава примери за това как да се декодира специалните символи.

Ако вашият сървър не декодира резултати от Форма, вие също ще получите заявка низ декодирани за вас върху командния ред. Това означава, че низа за заявка ще бъде на разположение в REXX чрез PARSE ARG команда, или в Perl $ARGV[n] масива.

Например, ако имате URL http://www.slac.stanford.edu/cgi-bin/foo?hello+world и използвате REXX команда PARSE ARG Arg1 Arg2 тогава Arg1 ще съдържа "hello" иArg2 ще съдържа "world" (т.е. + знак се заменя с интервал). 

В Perl $ARGV[1] съдържа "hello" и $ARGV[2] съдържа "world" . Ако решите да използвате командния ред за достъп до входа, което трябва да направите по-малко обработка на данните, преди да я използвате.

  • PATH_INFO Variable Environment

Голяма част от времето, вие ще искате да изпратите данни към вашите шлюзове които клиентът не трябва да се мотам с. Такава информация може да бъде името на формуляра, който генерира резултатите, които изпращате.

CGI дава възможност за допълнителна информация, за да бъдат вградени в URL адреса за вашата врата, която може да се използва за предаване на допълнително контекстно-конкретна информация за скриптовете. Тази информация обикновено се предоставя като "екстра" информация, след като по пътя на вашата врата в URL адреса. Тази информация не е кодиран от сървъра по никакъв начин. Тя може да бъде достъпен в REXX с помощта String=GETENV('PATH_INFO') , или в Perl, като използвате$string=$ENV('PATH_INFO');

За да илюстрирам това, нека кажем, че имам един CGI скрипт, който е достъпен за сървъра ми с име foo . Когато вляза в Foo от даден документ, искам да кажа, че Foo съм в момента на английски език директорията, не директория Pig Latin. В този случай, аз мога да вляза в моята скрипт в HTML документ, като:

<A HREF="http://www/cgi-bin/foo/language=english">foo</A>

Когато сървърът изпълнява Foo, тя ще ми даде PATH_INFO на /language=english , и моята програма може да декодира това и да действат по съответния начин.

В PATH_INFO и QUERY_STRING могат да бъдат комбинирани. Например, URL: 

http://www/cgi-bin/htimage/usr/www/img/map?404,451 

ще доведе до сървъра, за да стартирате скрипт, наречен htimage . Той ще премине останалата информация пътека " /usr/www/img/map ", за да htimage в променливата на обкръжението PATH_INFO, и мине" 405,451 "в променливата на QUERY_STRING. В този случай, htimage е скрипт за прилагането на активни карти, предоставени с Httpd CERN.

  • Standard Input

Ако вашият Form има МЕТОД = "POST" в своята ФОРМА тагове, вашият CGI програма ще получи кодирано входа форма на стандартния вход ( stdin в Unix). Сървърът не ще Ви изпратим EOF в края на данните, вместо да трябва да използвате променлива CONTENT_LENGTH среда, за да се определи колко данни трябва да се чете от стандартния вход. Можете да постигнете това в REXX с помощта In=CHARIN(,1,GETENV('CONTENT_LENGTH')) , или в Perl, като използвате read(STDIN,$in,$ENV{'CONTENT_LENGTH'});

Ако желаете да се премине на стандартния вход на друг скрипт, който ще ви се обадя по-късно, а след това може да искате да преразгледа CGI-lib.rxx REXX ПРОЦЕДУРАReadPost .

Можете да прегледате REXX фрагмент от код дава пример за това как да се чете на различни формата на принос в скрипта ви.

Процедурите Rexx ReadForm заедно с MethGet и MethPost , всички налични в CGI-lib.rxx, може да се използва, за да се опрости задачата за четене на данни от формуляр.

Декодиране Forms Input

Когато пишете Form, всеки един от вашите входни елементи има етикет име. Когато данните за потребителски места в тези обекти под формата, че информацията е кодирана в данните от формуляра. Стойността всеки от входящите елементи се дава от потребителя се нарича стойност.

Данни Form е поток на име = стойност двойки, разделени с амперсанд (&) символ. Всяко име = стойност двойка е URL кодирана, т.е. пространства са превърнати в знаци плюс и някои знаци са кодирани в шестнадесетичен вид. За да декодира данните от формуляра, първо трябва да се анализира блок Form данни в отделни двойки име = стойност подхвърлят посочват амперсанди. След това трябва да се анализира всяко име = стойност чифт в отделна името и стойността. Използвайте знака първия равен срещнете да се раздели на данните. Ако има повече от един, тогава нещо не е наред с данните. Отново хвърля на знака за равенство. Накрая отмените URL кодиране на всяко име и стойност.

Можете да прегледате Rexx или Perl код фрагмент дава примери за декодиране на входа на Form.

При използване на името и информацията стойност в сценария, вие трябва да сте наясно, че:

  • нищо диктува реда, в който името = стойност ще бъдат съединявани в;
  • не всяко име и стойност, дефинирана във формата е задължително, подадена от клиента, например, ако нищо не е избран в списък за превъртане тогава нито името, нитостойността ще бъдат изпратени;
  • повече от една стойност, може да бъде изпратен за собствено име, например, ако списък за превъртане позволява избор на няколко варианта.

Изпращане Document Назад към Client

CGI програми могат да се върнат безброй видове документи. Те могат да изпрати обратно изображение на клиента, един HTML документ, прав текст документ, послепис документи или може би дори на аудио клип на вашите телесни функции. Те също могат да се върнат препратки към други документи (да се спести място ние ще игнорира последния случай тук, повече информация може да се намери в CGI Primer NCSA е ). Клиентът трябва да знае какъв вид документ, който го изпращате, така че може да го представят съответно. За да може клиентът да знае това, вашият CGI програма, трябва да кажете на сървъра какъв тип документ се връщат.

С цел да се каже на сървъра какъв документ, който изпращате обратно, CGI изисква от вас да направите кратко с глава на вашата продукция. Това е удар с глава на ASCII текст, състояща се от линии разделени или linefeeds или абзац, последвани от linefeeds. Вашият скрипт мъст продукция най-малко две такива линии преди неговите данни ще бъдат изпратени директно обратно на клиента. Тези линии се използват за обозначаване на типа MIME на следния документ

Някои често срещани видове MIME, свързани с WWW са:

  • A "text" Content-Type, който се използва за представяне на текстова информация в редица знакови набори и форматиран текст описание езици по стандартизиран начин.Двете най-вероятно подтипове са:
    • text/plain : текст без никакви специални изисквания за форматиране.
    • text/html : текст с вградени HTML команди
  • An "application" Content-Type, който се използва за предаване на данни, приложения или двоични данни. Две често използвани подтипове са:
    • application/postscript : Данните са в PostScript, и трябва да се подава към PostScript interptreter.
    • application/binary : данните са в някакъв неизвестен двоичен формат, като например резултатите от трансфер на файлове.
  • An "image" Content-Type за предаване на неподвижни изображения (на снимката) на данни. Има много възможни подвидове, но тези, които най-често се използват за WWW са:
    • image/gif : изображение във формат GIF.
    • image/xbm : изображение във формат X Bitmap.
    • image/jpeg : изображение във формат JPEG.

С цел да се каже на сървъра тип съдържание вашата продукция е, на първа линия на вашата продукция трябва да се чете: 

Content-type: type/subtype 

където type/subtype е типът MIME и подтип за вашата продукция.

На следващо място, трябва да се изпрати на втора линия. С настоящата спецификация, втората линия трябва да бъде празно. Това означава, че тя трябва да има нищо на нея, освен с нов ред. След като сървърът извлича тази линия, тя знае, че сте готови казва сървъра за продукцията си и сега ще започне действителното производство. Ако пропуснете тази линия, сървърът ще се опита да се направи разбор на изхода си се опитва да намерите допълнителна информация за вашата заявка и ще стане много нещастен.

Можете да прегледате REXX Code Фрагмент давайки пример за работа с Content-type информация.

След тези две линии са изведени, всеки изход на stdout (например команда REXX думата) ще бъдат включени в документа се изпраща на клиента. Този изход трябва да бъде в съответствие с Content-type хедъра. Например, ако заглавието е посочено Content-type text/html тогава следния изход трябва да включва HTML форматиране, като например използване на <BR> или <P> ​​за започване на нови линии или <pre> да премахнете автоматично форматиране на HTML.

Диагностика и отчитане на грешки

От stdout е включен в документ, изпратен до, диагностика диагностика изведени с командата SAY ще се появи в документа. Можете да прегледате REXX Code Фрагмент давайки пример за диагностика отчитане.

Ако грешките са срещани (напр. няма входен условие, невалидни символи намерени, твърде много аргументи, определени, поискани невалидна команда, за да бъде изпълнена, невалиден синтаксис или недефинирана променлива срещат в сценария REXX) ​​скрипта трябва да предоставят подробна информация за това какво не е наред и т.н. То може да бъде много полезно да се предостави информация за настройките на различните променливи WWW Околна среда , които са определени.

На CGIerror , CGIdie и ​​MyURL Rexx процедури в CGI-lib.rxx осигуряват известна помощ за отчитането на грешки. Освен за проверка на код фрагменти Rexx използвайки CGIerror иизползвайки CGIdie и ​​също типичен изход CGIerror и CGIdie изход .

Две прости REXX WWW CGI скриптове

За да получите вашия уеб сървър, за да изпълни скрипт CGI трябва да:

  • Напиши сценария. За да се опрости тази процедура, може да искате да се възползвате от CGI-lib.rxx библиотеката от функции, включително някои, въведена по-рано на тази страница. Няколко прости, но пълни примери може да помогне за:
  • Направете скрипт изпълнимия файл на вашия уеб сървър. В SLAC на Unix това е направено с помощта на chmod командата, например
    • chmod o+x /u/sf/cottrell/bin/cgi1.rxx 

      chmod u+x /u/sf/cottrell/bin/cgi1.rxx
  • Махни си Web-Master , за да добавите правило за правила файл на уеб сървъра, за да се даде възможност на Web сървъра, за да изпълни вашия скрипт. Повече информация за правилата на файл W3C сървъра може да се намери, като погледнете в конфигурационния файл на уеб-W3C , както и един прост пример на някои от твърденията за картографиране използваеми във файла с правила.

The Web-Майстора ще искат да са сигурни, че въпросите на сигурността на вашия скрипт са били адресирани, преди да добавите вашия скрипт към файла с правила.

Други източници на лихви

  • Hard Copy:
    • Книгата HTML и CGI Unleashed има много полезна информация за писане на CGI скриптове в C, Perl и REXX.
    • В книгата Въведение в CGI / PERL от Steve Aoki Brenner & Edwin е полезно въведение към писане на CGI скриптове в Perl.
  • Писане World-Wide Web скриптове CGI в REXX представен на SHARE Техническа конференция Spring 1996 г., 7-ми Март 1996, Анахайм Калифорния.
  • The NetRexx Language Page предоставя информация относно експериментален проект от Майк Cowlishaw (авторът на REXX), за да се създаде Rexx предния край на Java.
  • Също така се настрои на дискусионна група comp.infosystems.www.authoring.cgi която обхваща обсъждане на развитието на Common Gateway Interface (CGI) скриптове, тъй като те се отнасят до уеб страница авторство. Възможните теми включват обсъждане как да се справят с резултатите от форми, как да се генерира изображения в движение, и как да се съберат други интерактивни уеб предложения.
  • The World Wide Web (Често задавани въпроси, с отговори) отговори на много, много въпроси за World Wide Web като цяло.
  • Ако използвате Perl и имате общи Perl въпрос, който не е наистина един CGI-конкретен въпрос, провери на Perl FAQ .
  • Ако ще се пише сценарии за Windows NT след това вижте Somarsoft - Windows NT въпроси на сигурността

Благодарности

Голяма част от текста на Common Gateway Interface и форми идва от документи самооценка. Полезна информация и текст също е получена от The World-Wide Web: Как Servers Work, от Марк Хендли и John Crowcroft, публикувани в ConneXions, февруари 1995 година.

1 Тази статия преведени на белоруски от Богдан Зограф 
2 Тази статия преведен на немски от Olga Babenko 
3 Тази статия преведени на руски език от Олег Meister. 

Like Us On FB

Ajoft Technologies

We are enterprise level product and applications development company specializing in developing high end scalable software and smart phone products and advanced applications.
Live Help