Notoricky známý průjezd CGI

Možná jste už četli hlavní téma tohoto čísla, které je věnované skriptovacím jazykům pro Web, a pak vám jistě p...


Možná jste už četli hlavní téma tohoto čísla, které je věnované skriptovacím
jazykům pro Web, a pak vám jistě připadá divné, že zde nacházíte článek
věnovaný CGI. Možná si řeknete, že tato technika je již zastaralá a nemá cenu
jí věnovat prostor. Ale to není tak úplně pravda. CGI programy dokážou stále
ještě odvést výbornou práci a v mnoha případech je jejich použití více než
dobrou variantou.
Zkuste se tedy předtím, než si vyberete nějaký skriptovací jazyk, podívat i na
tento článeček o CGI.
Asi nejlepší bude začít od začátku, tedy v tomto případě od nadpisu. Na první
pohled vám nadpis určitě připadá podivný, ale je to úplně obyčejný překlad
zkratky názvu CGI do češtiny. CGI je totiž zkratka pro Common Gateway
Interface, což lze do češtiny s troškou fantazie přeložit podobně jako nadpis
tohoto článku.
O co jde?
CGI ale samozřejmě není jen zkratka, byla to vlastně až donedávna jediná
možnost, jak dodat jinak statickému obsahu HTML stránek dynamiku. Toho webový
server dosahuje voláním externích programů s nimiž komunikuje právě podle
definice CGI. V současné době se asi nejčastěji setkáte s verzí 1.1 tohoto
protokolu a právě o ní bude dále řeč. Celý proces je zjednodušeně naznačen na
obrázku. Je tedy vidět, že pro klienta nedochází k žádným změnám a často nemusí
ani poznat rozdíl mezi statickými a dynamicky generovanými stránkami. Veškerou
logiku obstarává webový server, který pozná, že se jedná o CGI program. Server
tento program spustí a podle specifikace CGI mu předá parametry. K tomu používá
proměnných prostředí (environment variables) a někdy i standardního vstupu. CGI
program pak z těchto dat vygeneruje výsledek, nejčastěji HTML stránku, kterou
předá serveru svým standardním výstupem. Tento výsledek pak server předá
klientovi. Je tedy vidět, že celý mechanismus je velice jednoduchý, jediným
zádrhelem zůstává předávání parametrů.
Vstupní data
Celý proces předávání parametrů začíná na straně klienta. Data mohou být
předávána čtyřmi hlavními způsoby, a to pomocí formuláře, vstupním polem
ISINDEX, citlivou mapou nebo přímo webovým serverem.
HTML formulář asi nejrozšířenější použití, ve kterém uživatel zadává sám
potřebná data pomocí klávesnice (např. osobní údaje, hledanou položku, zboží
apod.) ve speciálně připravené statické stránce za použití standardních tagů
HTML, podobně jako v tomto příkladě, kdy je uživatel dotazován na své jméno:
<FORM METHOD="POST" ACTION="/cgi-bin/action.cgi">
<B>Vaše jméno:</B> <INPUT NAME=jmeno SIZE=40 MAXLENGTH=40>
<INPUT TYPE=SUBMIT
</FORM>
Důležitý je hlavně vstupní řádek, který určuje, jak se CGI program dostane k
dalším proměnným formuláře. Pokud je specifikována metoda POST, jsou data
předána na standardním vstupu. Velikost těchto dat udává proměnná prostředí
CONTENT_ LENGTH. Vlastní data jsou pak ve formátu jméno=hodnota, kde hodnota
obsahuje zakódovaná data tzv. URL encoded. To ve zkratce znamená, že data mohou
obsahovat pouze čísla a písmena anglické abecedy, všechny ostatní znaky jsou
zakódovány pomocí syntaxe %xx, kde xx je hexadecimální hodnota původního znaku.
Výjimkou je mezera, místo které může být použit znak +.
V případě použití metody GET jsou data předána v proměnné QUERY_STRING a
hodnoty jsou zde ve formátu jméno1=hodnota1&jméno2=hodnota2 atd. V tomto
případě není proměnné CONTENT_LENGTH přiřazena žádná hodnota. Použití metody
GET také lehce poznáte podle cílové adresy, zobrazená stránka totiž vypadá
nějak takto:
http://www.server.cz/cgi-bin/action.cgi?subject=pokus&jmeno=Franta. Tato metoda
má omezené možnosti a je náchylnější k útokům hackerů, proto je lepší používat
metodu POST.
Pole ISINDEX data jsou v tomto případě předána jako parametr příkazového řádku,
jsou již dekódována a předána procesu jako argumenty. V současné době se již
ISINDEX příliš nepoužívá.
Citlivá mapa data jsou předána v proměnné QUERY_ STRING a mají formát xx,yy,
kde xx a yy jsou souřadnice bodu na mapě. Vyvolávaný skript je v tomto případě
určen přímo konfigurací serveru.
Data od webového serveru některé proměnné nastavuje přímo server. Výběr těch
nejzajímavějších naleznete v tabulce.
Výstup hlavička, tělo
Výstup dat je oproti vstupu daleko jednodušší, veškeré informace se k uživateli
dostanou pomocí standardního výstupu programu. Pro většinu praktického použití
postačuje zjednodušené schéma s pouhým jedním řádkem hlavičky, podobně jako je
tomu v následujícím příkladě (shell skript):
echo Content-Type: text/html
echo
echo <HTML> ...
První dva řádky jsou hlavička, poté již následuje přímo odpověď v HTML formátu,
hlavička jsou tedy první řádky odpovědi oddělené prázdným řádkem. Dalšími
možnými parametry může být Content-length (velikost dat bez hlavičky), Expires
(datum, do kterého je dokument platný), Content-encoding (specifikováno,
jsou-li data komprimována) a Location (dojde k přesměrování požadavku na již
existují dokument specifikovaný jako parametr).
Další možností je vrátit v hlavičce stavový kód. Toho využijete zejména u
neočekávaných stavů. V takovém případě byste asi měli použít buď kód 500
Internal Server Error (pro chybové stavy), anebo 501 Not Implemented (pokud
uživatel volá ještě nepřipravenou funkci).
Dostupné možnosti
Vidíte tedy, že CGI je velice jednoduchý a přitom účinný nástroj. Lze jej psát
v téměř každém programovacím jazyce a podporují ho skoro všechny webové servery
na různých platformách. Mezi nejčastěji používané jazyky patří Perl, C, C++,
ale dobře fungují i CGI programy napsané v unixovém shellu nebo jako BAT soubor
pod Windows. Neposledním argumentem pro CGI pak může být obrovské množství již
napsaných a volně dostupných programů, které na Webu můžete najít. Myslete tedy
i na něj při výběru nástroje pro své dynamické stránky.
Proměnné dostupné pro CGI programy (výběr)
Název proměnné: Význam:
SERVER_NAME internetová adresu serveru (může být i jen IP)
SERVER_PORT číslo portu, který byl použit (většinou 80)
REQUEST_METHOD použitá metoda, nejčastěji GET nebo POST
PATH_TRANSLATED kompletní cesta k programu
REMOTE_HOST jméno klientského počítače (může být prázdné)
REMOTE_ADDR IP adresa klientského počítače
K těmto základním proměnným se pak přiřazují další z hlavičky HTTP požadavku:
HTTP_ACCEPTMIME typy, které klient může přijmout a umí zobrazit
HTTP_USER_AGENT identifikace klientského prohlížeče
0 0173 / als









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.