COMPUTERWORLD
 

profil kontakt CD-ROM CW100 p°edplatnΘ

archiv anketa CO VY NA TO? CW kariΘra serißly
 

IDG

IDG CZ homepage
COMPUTERWORLD
PC WORLD
INTERNET4U
MEGABYTE
TESTCENTRUM
ON-LINE






COMPUTERWORLD 21/98

CGI skripty

Ji°φ Kosek ml.

Dosud jsme se zab²vali p°φpady, kdy urΦitΘ URL adrese odpovφdal na serveru soubor, kter² obsahoval HTML k≤d dopln∞n² p°φpadn∞ o n∞jakΘ v²konnΘ p°φkazy (SSI, ASP, PHP), kterΘ se p°ed odeslßnφm dokumentu provedly. URL vÜak m∙₧e ukazovat p°φmo na spustiteln² soubor, kter² po svΘm spuÜt∞nφ vygeneruje HTML strßnku. SpustitelnΘmu souboru °φkßme obvykle CGI skript, podle rozhranφ CGI (Common Gateway Interface), kterΘ definuje zp∙sob p°edßvßnφ dat mezi WWW serverem a CGI skriptem.

JakΘ jazyky m∙₧eme pou₧φt pro psanφ CGI skript∙?

Odpov∞∩ je jednoduchß -- pro psanφ CGI skript∙ m∙₧eme pou₧φt tΘm∞° libovoln² programovacφ jazyk. NejΦast∞ji se pou₧φvajφ r∙znΘ p°φkazovΘ interprety Unixu a jazyk Perl. Pom∞rn∞ Φasto se CGI skripty pφÜφ i v jazycφch C nebo C++. Takto napsanΘ skripty b²vajφ rychlejÜφ, majφ menÜφ systΘmovΘ nßroky a navφc jsou bezpeΦn∞jÜφ. Nejv∞tÜφ novinkou na poli jazyk∙ pro CGI je vÜak Java. V Jav∞ lze krom∞ applet∙ psßt i b∞₧nΘ aplikace a ty mohou plnit funkci CGI skriptu. Jako analogie k nßzvu applet se t∞mto program∙m n∞kdy °φkß servlety -- CGI skripty jsou samoz°ejm∞ v₧dy provßd∞ny na serveru.

Aby byl v²sledn² program pou₧iteln² jako CGI skript, musφ spl≥ovat pouze 2 podmφnky:

- musφ um∞t p°ebφrat parametry p°edanΘ pomocφ rozhranφ CGI;

- v²sledkem jeho Φinnosti je odpov∞∩ ve formßtu HTTP (bez prvnφ stavovΘ °ßdky) zapsanß na standardnφ v²stup programu.

Jak probφhß spoluprßce WWW serveru s CGI skriptem?

Na poΦßtku komunikace je op∞t po₧adavek klienta na urΦitΘ URL. Toto URL vÜak nynφ ukazuje na CGI skript. Krom∞ adresy CGI skriptu m∙₧e klient p°edat serveru parametry, kterΘ ovlivnφ chovßnφ skriptu.

Server zjistφ, ₧e po₧adovanΘ URL je pot°eba obslou₧it CGI skriptem. Server to nejΦast∞ji poznß podle toho, ₧e na zaΦßtku cesty v URL je uveden adresß° cgi-bin (jmΘno tohoto adresß°e lze nastavit v serveru Apache pomocφ direktivy ScriptAlias v konfiguraΦnφm souboru srm.conf.). Server skript spustφ a p°edß mu parametry pomocφ rozhranφ CGI.

Nynφ hlavnφ slovo dostßvß CGI skript. Zpracuje p°edanΘ parametry a jako v²sledek na sv∙j standardnφ v²stup zapφÜe odpov∞∩ ve tvaru protokolu HTTP. Tento v²stup je zachycen WWW serverem, kter² doplnφ dalÜφ hlaviΦky do HTTP odpov∞di a vÜe poÜle zp∞t klientovi jako odpov∞∩. V tΘto fßzi se WWW server obvykle chovß pon∞kud prot°ele a starß se o to, aby odpov∞∩ byla zaslßna stejnou verzφ HTTP, jakou pou₧il po₧adavek. Pokud tedy byl po₧adavek vznesen pomocφ HTTP/0.9, odstranφ WWW server p°ed odeslßnφm v²stupu CGI skriptu vÜechny HTTP hlaviΦky.

NßÜ prvnφ CGI skript

Ne₧ se pustφme do psanφ vlastnφch CGI skript∙, m∞li bychom si ov∞°it, zda to mßme od sprßvce serveru v∙bec povoleno. Servery b²vajφ Φasto nakonfigurovßny tak, ₧e CGI skripty lze spouÜt∞t pouze z jednoho adresß°e a do tohoto adresß°e nemß prßvo p°φstupu ka₧d². Pouze ti u₧ivatelΘ, o kter²ch si sprßvce serveru myslφ, ₧e jejich skripty nenaruÜφ bezpeΦnost serveru.

Pokud mßme vytvß°enφ CGI skript∙ povoleno, musφme si rovn∞₧ zjistit, do kterΘho adresß°e je m∙₧eme uklßdat. Obvykle b²vß vyhrazen jeden spoleΦn² adresß° (a jeho podadresß°e) pro vÜechny u₧ivatele. V Unixu tento adresß° b²vß nap°. /usr/local/etc/httpd/cgi-bin, v instalaci serveru Apache pod Windows pak jde o x:\Apache\cgi-bin. Pokud do tohoto adresß°e ulo₧φme skript pojmenovan² pokus.cgi, bude p°φstupn² pomocφ URL http://server/cgi-bin/pokus.cgi.

Nynφ jsou zdßnliv∞ vÜechny problΘmy vy°eÜeny. Opak je vÜak pravdou. Nynφ nßm zb²vß vybrat programovacφ jazyk, ve kterΘm budeme CGI skripty psßt. Pravd∞podobn∞ si vybereme ten jazyk, kter² dob°e ovlßdßme. Pro zßpis naÜeho ukßzkovΘho skriptu pou₧iji p°φkazov² interpret sh, kter² je nedφlnou souΦßstφ vÜech instalacφ operaΦnφho systΘmu Unix. Skripty pro sh jsou obdobou dßvkov²ch soubor∙, jak je znßme jeÜt∞ z dob MS-DOSu. NaÜe ukßzka vÜak bude tak jednoduchß, ₧e ji pochopφte i bez znalosti interpretu sh.

Vytvo°φme skript, kter² vypφÜe seznam u₧ivatel∙, kte°φ prßv∞ na serveru pracujφ -- v Unixu toti₧ m∙₧e na jednom poΦφtaΦi pracovat vφce u₧ivatel∙ najednou. K v²pisu prßv∞ p°ihlßÜen²ch u₧ivatel∙ slou₧φ p°φkaz who. Ten budeme proto volat z naÜeho skriptu, kter² krom∞ toho vytvo°φ pot°ebnΘ hlaviΦky HTTP. V praxi v∞tÜinou staΦφ pou₧φt pouze hlaviΦku Content-type a urΦit typ dat, kterß dßle bude skript generovat. Jeliko₧ p°φkaz who generuje obyΦejn² textov² v²stup, m∙₧eme pou₧φt typ dat text/plain -- obyΦejn² text. Skript ulo₧φme nap°. do souboru test1.cgi.

#!/bin/sh
echo 'Content-type: text/plain'
echo
/usr/bin/who

AΦkoliv skript je pom∞rn∞ krßtk², podφvßme se na n∞j trochu podrobn∞ji a vÜe si vysv∞tlφme. Prvnφ, pon∞kud magickß °ßdka skriptu urΦuje, kter² p°φkazov² interpret se pou₧ije pro vykonßnφ skriptu -- v naÜem p°φpad∞ tedy sh, kter² je ulo₧en v adresß°i bin.

P°φkaz echo vypisuje sv∙j argument na standardnφ v²stup. Druhß a t°etφ °ßdka CGI skriptu tedy vygeneruje HTTP hlaviΦku (typ dat a prßzdnß °ßdka). ╚tvrt² °ßdek zavolß p°φmo p°φkaz who. V²stup p°φkazu je zaslßn na standardnφ v²stup a proto se u₧ o nic nemusφme starat.

U souboru test1.cgi musφme jeÜt∞ sprßvn∞ nastavit atributy tak, aby byl soubor spustiteln². K tomu nßm poslou₧φ p°φkaz chmod +x test1.cgi.

V²sledek naÜeho sna₧enφ si m∙₧eme prohlΘdnout na obrßzku 2. Fungujete to, ale jaksi to jeÜt∞ nenφ ono. V²stup je p°φliÜ stroh² a zdaleka nevyu₧φvß mo₧nosti, kterΘ nßm Web nabφzφ.

Vyu₧ijeme toho, ₧e CGI skript m∙₧e klidn∞ generovat HTML k≤d. StaΦφ, kdy₧ v HTTP hlaviΦce pou₧ijeme Content-type: text/html a v²stup skriptu se bude v prohlφ₧eΦi interpretovat jako strßnka zapsanß v jazyce HTML. Upravφme tedy nßÜ skript do novΘ podoby a pojmenujeme jej nap°. test2.cgi (op∞t nesmφme zapomenout na nastavenφ atributu spustitelnosti):

#!/bin/sh
echo 'Content-type: text/html'
echo
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">'
echo '<HTML>'
echo '<TITLE>P°ihlßÜenφ u₧ivatelΘ</TITLE>'
echo '</HEAD>'
echo '<BODY>'
echo '<H1>P°ihlßÜenφ u₧ivatelΘ</H1>'
echo '<PRE>'
/usr/bin/who
echo '</PRE>'
echo 'V p°φpad∞ problΘm∙ a dotaz∙ kontaktuj'
echo '<A HREF="mailto:webmaster@server.cz">Webmastera</A>.'
echo '</BODY>'
echo '</HTML>'

Pomocφ p°φkaz∙ echo jsme vygenerovali vÜechen pot°ebn² HTML k≤d. V²stup programu who jsme umφstili mezi tagy <PRE> a </PRE>, aby bylo zachovßno °ßdkovanφ. V²sledek novΘho skriptu je ji₧ mnohem uspokojiv∞jÜφ (viz obr. 3).

Po opravdu krßtkΘm ·vodu do problematiky CGI na nßs v nßsledujφcφm pokraΦovßnφ serißlu bude Φekat popis p°edßvßnφ parametr∙ pomocφ rozhranφ CGI. Teprve potΘ mohou b²t naÜe skripty interaktivnφ a aktivn∞ reagovat na pot°eby u₧ivatel∙.

U₧ dnes si vÜak m∙₧eme polo₧it otßzku, zda je lepÜφ pou₧φvat CGI skripty nebo n∞kter² z modernφch systΘm∙ serverov²ch vsuvek, jako je PHP nebo ASP. Ve v∞tÜin∞ p°φpad∙ je mnohem snazÜφ a rychlejÜφ pro v²voj aplikacφ pou₧φt PHP nebo ASP. Pou₧itφ klasick²ch CGI skript∙ je v²hodnΘ v p°φpadech, kdy "toho pot°ebujeme hodn∞ spoΦφtat a mßlo zobrazit" -- vid∞li jsme, ₧e veÜker² HTML k≤d se v CGI skriptech musφ pom∞rn∞ pracn∞ zapisovat pomocφ p°φkazu echo nebo n∞jakΘ jeho obdoby.

Jak jeÜt∞ uvidφme p°φÜt∞, proti pou₧itφ CGI hovo°φ i slo₧it∞jÜφ prßce s parametry a potencißln∞ v∞tÜφ bezpeΦnostnφ rizika.n

 

 

© IDG Czechoslovakia, a.s., VÜechna prßva vyhrazena
info@idg.cz, webmaster@idg.cz