Przewodnik do pisania skryptów CGI w REXX i Perl

Source : http://www.slac.stanford.edu/slac/www/resource/how-to-use/cgi-rexx/cgi.html

Spis treści

  • Wprowadzenie
  • pierwsze wejście na
  • dekodowanie skryptów formularze Input
  • Wysyłanie dokumentu do klienta
  • raportowanie błędów
  • dwa proste REXX WWW skrypty CGI
  • inne źródła informacji

 

Wstęp
Niniejszy poradnik jest przeznaczony dla ludzi, którzy chcieliby pisać własne WWW skrypty wykonywalne za pomocą WWW’s Common Gateway Interface (CGI). Chociaż główny nacisk położono na REXX wielu przykładów są dostarczane również w języku Perl.

Istnieją pewne proste biblioteki oprogramowania, aby ułatwić pisanie skryptów CGI. cgi-lib.rxx jest REXX biblioteka funkcji (dostępne w SLAC za pomocą
wywołania REXX PUTENV ‘REXXPATH=/afs/slac/www/slac/www/tool/cgi-rexx’
oświadczenia bibliotece na czas realizacji)i cgi-lib.pl jest podobny biblioteka w Perl autorstwa Steve Brennera (tam jest wykonywalna kopia tej biblioteki w SLAC w katalogu /afs/slac/g/www/cgi-lib/cgi-lib.pl). NCSA posiada bardzo przydatny zestaw Perl CGI handler podprogramów, które dostępne są za pośrednictwem anonimowego FTP.inny zestaw Perl CGI serwer strony skrypty napisane przez Brigitte Jellinek dostępny jest na licencji GNU Public License. Dostępny jest również kod źródłowy www.stanford.edu skrypty i programy. Istnieje również indeksu do Perl WWW programy zgromadzone przez Earl kaptur. Wreszcie zobaczyć Web Development Centre.

Ponieważ istnieją zabezpieczenia i inne zagrożenia związane z wykonaniem skryptów użytkownika w serwerze WWW, czytelnik może chcą najpierw zobaczyć dokument zawierający informacje o statusie zabezpieczeń SLAC Ugiwanym przez użytkowników skryptów CGI. Oprócz zwiększenia bezpieczeństwa, ta otoczka upraszcza także zadanie napisania skryptu CGI dla początkujących.

Zanim wyruszą Państwo na napisania skryptu, możesz również wypróbować niektóre szczególne SLAC Narzędzia Web podawanymi przez skrypty CGI.

Na CGI jest interfejsem do uruchamiania programów zewnętrznych, bram lub, na podstawie informacji o serwerze. Obecnie obsługiwane są informacje są serwery HTTP (protokół transportowy używany przez WWW) serwerów.

Bramy są programy wykonywalne programy (np. Skrypty UNIX), które mogą być prowadzone przez siebie (ale nie chcesz chyba podczas debugowania). Zostały one wykonane plików wykonywalnych, które pozwolą im pracować pod najróżniejszymi (ewentualnie bardzo różne) serwerów informacyjnych zamiennie. Bramy programów spełniających wymagania niniejszej specyfikacji mogą być napisane w dowolnym języku, w tym REXX lub Perl, który produkuje plik wykonywalny

Pierwsze wejście do skryptu
wejściowego może być przesłane do skryptu na kilka sposobów w zależności od klienta, Uniform Resource Locator (URL) lub HTML (HyperText Markup Language):

QUERY_STRING zmienn± ¶rodowiskow±

QUERY_STRING jest definiowana jako wszystkiego, co następuje pierwsze ? URL umożliwiają dostęp do bramy. Te informacje mogą zostać dodane przez ISINDEX HTML dokument lub przez formularz HTML (z czego). Może to być również ręcznie osadzone w HTML hiperłącza, lub anchor, który odnośniki bramy. Ciąg ten będzie zazwyczaj informacje o zapytaniu, np. jakie użytkownik chce wyszukiwanie w bazach danych, lub bodaj zakodowane wyniki wypełniając formularz. Można go uzyskać w REXX używając String=GETENV(‘QUERY_STRING’]
lub w języku Perl przy wykorzystaniu $string=$ENV(‘QUERY_STRING’];

Ten tekst jest kodowany w standardowym formacie URL, który zmienia się w przestrzeni , oraz kodowanie znaków specjalnych z %xx kodowanie szesnastkowe. Będziesz musiał je odszyfrować w celu użycia go. Możesz przejrzeć cgi-lib.rxx REXX DeWeb procedury lub kod Perla skrawka podając przykłady jak rozszyfrować znaki specjalne.

Jeżeli Twój serwer nie jest dekodowanie wynika z formy, można będzie również uzyskać query string odkodowany dla ciebie do linii komend. Oznacza to, że zapytanie będzie dostępne w REXX poprzez analizy składniowej ARG polecenia, lub w języku Perl $ZMIENNYCH ARGV[n] macierz.

Na przykład, jeśli masz URL http://www.slac.stanford.edu/cgi-bin/foo?hello świata i użyjesz komendy REXX ANALIZOWAŁO ARG Arg1 Arg2 Arg1 będzie zawierać frazę “hello” i Arg2 będzie zawierał “świat” (czyli znak jest zastąpiona znakiem spacji).
W Perl $ZMIENNYCH ARGV[1] zawiera “hello” i $ZMIENNYCH ARGV[2] zawiera “świata”. Jeżeli zdecydujesz się użyć w wierszu polecenia, aby uzyskać dostęp do wejścia, trzeba zrobić mniej obliczeń na danych przed jej użyciem.

PATH_INFO zmienn± ¶rodowiskow±

Dużo czasu, będziesz chciał wysłać dane do twoich bram, których klient nie powinien gnój. Taka informacja może być nazwą postaci które generowane wyniki wysyłają.

CGI pozwala na dodatkowe informacje, które mają być osadzone w URL do bramy, które może być wykorzystane do przesyłania dodatkowego kontekstu konkretnych informacji do skryptów. Taka informacja jest zwykle podawane jako “ekstra” informacji po drodze brama w adresie URL. Ta informacja nie jest kodowana przez serwer w jakikolwiek sposób. Można go uzyskać w REXX używając String=GETENV(‘PATH_INFO’], lub w języku Perl przy wykorzystaniu $string=$ENV(‘PATH_INFO’];

W celu zilustrowania tego, powiedzmy mam skrypt CGI, który jest dostępny na serwerze o nazwie foo. Kiedy komendę foo z danego dokumentu, chcę opowiedzieć foo, że jestem obecnie w języku angielskim katalog, a nie the Pig Latin katalog. W tym przypadku, mogłam wejść do mojego skryptu w dokument HTML jako:

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

Gdy serwer uruchamia foo, dajże mi PATH_INFO /language=english, a mój program może rozszyfrować ten i działać odpowiednio.

Z PATH_INFO a Query_STRING mogą być łączone. Na przykład adres URL:
http://www/cgi-bin/htimage/usr/www/img/map?404,451
spowoduje, że serwer Uruchom skrypt o nazwie htimage. Nie przełożą pozostałe informacje path “/usr/www/img/map” htimage w PATH_INFO zmienn± ¶rodowiskow±, i mijają “405,451” w Query_STRING zmienna. W tym przypadku htimage jest skrypt dla wdrażających aktywne mapy dostarczone z CERN HTTPD.

Wejście standardowe

Jeśli twoja postać ma method=”POST” w swojej formie tag, twój program CGI otrzyma w formie zakodowanej, wejście na standardowe wejście (stdin w systemach UNIX). Serwer nie wyśle ci wiadomość EOF na końcu danych, zamiast tego należy zastosować zmienn± ¶rodowiskow± CONTENT_LENGTH, aby określić, jak dużo danych należy czytać z stdin. Można to osiągnąć w REXX korzystając w=CHARIN(,1,GETENV(‘CONTENT_LENGTH’), lub w języku Perl przy wykorzystaniu read(STDIN,$na$ENV{‘CONTENT_LENGTH’});

Jeśli chcesz przekazać standardowe wejście na inny skrypt, który oddzwoni później, potem możesz chcieć przejrzeć cgi-lib.rxx REXX ReadPost procedury.

Możesz przejrzeć kod REXX Skrawka podając przykład jak odczytać różne formy wejścia do twojego skryptu.

Na REXX ReadForm procedur wraz z MethGet i MethPost, wszystkie dostępne w cgi-lib.rxx, mogą być wykorzystywane w celu uproszczenia zadań odczytu danych z formularza.
Dekodowanie sygnału wejściowego formy
po napisaniu formularza, każdy z wprowadzanymi pozycjami o nazwie tag. Gdy użytkownik umieszcza dane w tych pozycjach w formularzu, że dana informacja jest kodowana w postaci danych. Wartość każdego z elementów wejściowych jest podany przez użytkownika jest nazywana wartością.

Dane z formularza jest strumień nazwa=wartość par oddzielonych znakiem ampersand (&), znak. Każda nazwa=wartość parę zakodowanych adresów URL, tj. pomieszczenia są zamieniane na znaki plus i niektóre znaki są kodowane w systemie szesnastkowym. Aby odkodować dane formularza należy najpierw przeanalizować formę bloku danych do osobnych nazwa=wartość par ciskające się dwiema komendami. Następnie należy przeanalizować każde nazwisko=wartość szczypiec do oddzielnych nazwę i wartość. Użyj pierwszego znaku równości napotkasz na rozdzielenie danych. Jeśli istnieje więcej niż jeden, wówczas coś się stało z danymi. Ponownie toss poza equals zjawiskami. Wreszcie odkręcić kodowanie adresów URL dla każdej nazwy i wartości.

Możesz przejrzeć REXX lub kod Perla skrawka podając przykłady dekodując zawartość formularza.

Podczas używania nazwy i wartości informacji w skrypcie, trzeba być świadomym, że:

Nic nie dyktuje kolejność w której nazwa=wartość będą łączone w;
nie każda nazwa i wartość zdefiniowaną w formie niekoniecznie jest wysyłane przez klienta, na przykład, jeśli nic nie jest zaznaczone w liście rozwijanej wówczas ani nazwy, ani wartość zostanie wysłana;
więcej niż jedną wartość, mogą być one wysłane do danej nazwy, na przykład jeśli przewijalną listą umożliwia wybór kilku opcji.

Wysyłając dokument z powrotem do klienta
Programy CGI mogą powrócić a myriad typów dokumentów. Mogą oni wysyłać powrót obrazu do klienta, dokument HTML, dokumenty tekstowe, dokumenty Postscript lub nawet klip audio twojego funkcjonowania ciała. Mogą one również powrót odnośniki do innych dokumentów (dla oszczędności miejsca będziemy ignorować ten ostatni przypadek tutaj, więcej informacji można znaleźć w ośrodku NCSA’s CGI Primer). Klient musi wiedzieć, jakiego rodzaju dokument jesteś wysyłając ją może więc wręczyć ją odpowiednio. W taki sposób, aby klient mógł wiedzieć, to twój program CGI należy poinformować serwer jaki typ dokumentu jest zwrot.

Aby stwierdzić, czy serwer jakiego rodzaju dokument wysyłasz grzbietu, CGI wymaga, aby umieścić krótki nagłówek na wydruku. Ten nagłówek jest tekst ASCII, składające się z linii oddzielone za pomocą notacji lub powroty po notacji. Twój skrypt musi wyjść przynajmniej dwie takie linie przed jego dane zostaną wysłane bezpośrednio do klienta. Linie te są używane do określenia typu MIME w następującym dokumencie

niektóre popularne typy MIME istotnych dla WWW to:

“text” Content-Type, który jest używany do reprezentowania informacje tekstowe w wielu zestawów znaków i sformatowany tekst opisu języków w ujednolicony sposób. Dwie najbardziej prawdopodobne są podtypy:
text/plain tekstu: przy braku specjalnych wymagań formatowania.
text/html: tekst z wbudowanych poleceń HTML
“aplikacji” Content-Type, która jest używana do transmisji danych aplikacji lub danych binarnych. Dwa najczęściej stosowane są podtypy:
application/postscript: dane są w formacie PostScript, i powinny być karmione a PostScript interptreter.
application/binarne: danych w jakimś nieznanym formacie binarnym, takie jak wyniki transferu plików.
“Image” Content-Type do transmisji obrazu fotograficznego (zdjęcia) danych. Istnieje wiele podtypów, ale najczęściej używane na stronach WWW są:
image/gif: obraz w formacie GIF.
Obraz/xbm: obraz w formacie mapy bitowej.
image/jpeg: obraz w formacie JPEG.

Aby stwierdzić, czy serwer wydruku jest typu zawartości, pierwsza linia wydruku powinien przeczytać:
Content-type: typ/podtyp
gdzie typ/podtyp jest typ MIME i podtypu dla wydruków.

Dalej, musisz wysłać drugą linię. Z aktualną specyfikacją, drugi wiersz powinien być pusty. Oznacza to, że powinien on mieć nic na nim oprócz a karetki”. Gdy serwer pobiera tę linię, to wie że jesteś gotowy pretekst do serwera o wyjście i będzie teraz rozpocząć rzeczywistej mocy wyjściowej. Jeśli pominiesz ten wiersz, serwer będzie próbował analizować dane wyjściowe próbując znaleźć dalsze informacje dotyczące żądania i będziesz się bardzo nieszczęśliwy.

Możesz przejrzeć jeszcze raz dany kod REXX Skrawka podając przykład postępowania z content-type information.

Po tych dwóch linii zostały wydane, każde wyjście wypisywany na (np. REXX wymawiać polecenia zostaną zamieszczone w dokumencie wysyłanym do klienta. Wyjście to musi być zgodne z treścią typu hedera. Na przykład, jeśli heder określonych content-type text/html a następnie następujący wynik musi zawierać formatowania HTML, takich jak używanie <br> lub <P> w celu uruchomienia nowych linii lub <PRE> aby usunąć HTML automatycznego formatowania.

Diagnostyka i raportowanie błędów
ponieważ wypisywany jest zawarta w dokumencie wysyłanym do, diagnostyka diagnostyka wysłany z wymawiać polecenia pojawi się w dokumencie. Możesz przejrzeć jeszcze raz dany kod REXX Skrawka podając przykład raporty diagnostyczne.

Jeśli wystąpią błędy (np. brak danych wejściowych, nieprawidłowe znaki, zbyt wiele określonych argumentów, poprosił o nieprawidłowe polecenia, które mają być wykonane, invalid syntax lub Niezdefiniowana zmienna napotkane w skrypcie REXX) skrypt powinien podać szczegółowe informacje o tym, co jest złe… to może być bardzo przydatna w celu dostarczenia informacji na temat ustawień różnych WWW zmiennych środowiska, które są ustawione.

Na CGIerror, CGIdie i REXX MyURL procedury w trybie cgi-lib.rxx zapewniają pewną pomoc dla raportowania błędów. Oprócz przeglądu REXX fragmentów kodu za pomocą CGIerror i używając CGIdie a także typowe wyjście CGIerror CGIdie i wyjście.

Dwa proste REXX WWW skrypty CGI
na serwerze www, który wykonuje skrypt CGI należy:

Napisać skrypt. Aby uprościć to, możesz chcieć skorzystać z cgi-lib.rxx biblioteka funkcji, w tym niektóre z wprowadzonych wcześniej na tej stronie. Kilka prostych, ale kompletne przykłady mogą pomóc:
źródło skryptu aby umożliwić UNIX funkcji palców.
źródło minimalizm HTTP formularz i skrypt.
Wykonać skrypt wykonywalny przez twój serwer WWW. Co SLAC na Unix wykonuje się to za pomocą polecenia chmod, np.
chmod o x /u/SF/cottrella/bin/cgi1.rxx
chmod u x /u/SF/cottrella/bin/cgi1.rxx
Get your Web-Master aby dodać regułę do serwera www regulamin plik do serwera www do zlikwidowania twojego skryptu. Więcej informacji na temat standardu W3C server plik może być znaleziona poprzez odczytanie pliku konfiguracyjnego W3C httpd, jak również prosty przykład niektórych mapowanie oświadczenia w piwowarstwie plik reguł.

Na Web-Master będzie chciała się upewnić, że aspekty bezpieczeństwa w twoim skrypcie zostały skierowane przed dodaniem skryptu do pliku zasad.

Innych źródeł zainteresowania

Hard Copy:
książki HTML & CGI Napuścił posiada wiele przydatnych informacji na temat pisania skryptów CGI w C, Perl i REXX.
Książka wprowadzenie do CGI/PERL Steva Brenner & Edwin Aoki to dobry wstęp do pisania skryptów CGI w języku Perl.
Pisanie limitowana www skrypty CGI w REXX zaprezentowanych na wiosnę 1996 r. udział w konferencji technicznej, 7 marca 1996, interes w Kalifornii.
W języku NetRexx strona zawiera informacje na temat eksperymentalnego projektu przez Mike Cowlishaw (autor REXX) aby utworzyć Rexx przód do Javy.
Również dostroić do grupy dyskusyjnej comp.infosystems.www.authoring.cgi która obejmuje omówienie rozwoju Common Gateway Interface (CGI) skrypty, jak odnoszą się one do strony internetowej authoring. Możliwe tematy obejmują dyskusję, jak potraktować wyniki formularzy, generowanie obrazów w locie, i w jaki sposób zestawiać innych interaktywnych usług www.
World Wide Web (najczęściej zadawane pytania, z odpowiedziami) odpowiedzi na wiele pytań na temat World Wide Web w ogóle.
Jeśli używasz Perl i masz ogólne Perl pytanie, że tak naprawdę nie jest a CGI-konkretne pytanie, zajrzyj do FAQ w języku Perl.
Jeśli będą pisać skrypty dla Windows NT, a następnie patrz Somarsoft – Windows NT problemów z bezpieczeństwem