[ 13. December 1999]
- Svato_Straka
Spracovanie vstupu - 5. Φas¥ CGI
V dneÜnej Φasti serißlu o CGI si povieme nieΦo o tom, ako spracova¥ vstupnΘ dßta ktorΘ u₧φvate╛ ak²mko╛vek sp⌠sobom odovzdß vßÜmu skriptu. Hne∩ na zaΦiatok je vÜak potrebnΘ upozornenie: v₧dy dobre skontrolujte dßta, ktorΘ vßm klient poÜle na vstup CGI skriptu.
Nikdy na ich zßklade nepoÜlite klientovi naspΣ¥ informßcie, ktorΘ m⌠₧u ovplyvni¥ bezpeΦnos¥ vßÜho servra!
CGI program m⌠₧e ako vstup prija¥ jeden z troch typov dßt:
- informßcie o klientovi, servri a u₧φvate╛ovi
- dßta z formulßra
- dodatoΦnΘ informßcie o ceste
O prvom a tre¥om type vstupn²ch dßt sme si u₧ povedali, ₧e ich m⌠₧ete v CGI skripte pou₧i¥ ako premennΘ (premennΘ prostredia), resp. zφska¥ ich pomocou premenn²ch prostredia (info o ceste z premenn²ch PATH_INFO, PATH_TRANSLATED, DOCUMENT_ROOT a SCRIPT_NAME). V minulej Φasti sme si zasa povedali o formulßroch a o tom, akΘ dßta odovzdßvaj· skriptu, pozrime sa teraz teda na spracovanie t²chto dßt.
Pri odoslanφ dßt z formulßra sa tieto odoÜl· servru pomocou jednej z met≤d GET alebo POST v tvare nßzov_prvku=hodnota_prvku . Ak je formulßr tvoren² viacer²mi prvkami, jednotlivΘ dvojice prvok-hodnota bud· oddelenΘ znakom &, Φi₧e vstup bude vyzera¥ nasledovne:
prvok_1=hodnota_1&prvok_2=hodnota_2&...&prvok_n=hodnota_n
Dßta, ktorΘ prichßdzaj· na vstup skriptu m⌠₧u by¥ tvorenΘ ak²miko╛vek znakmi. Z pochopite╛nej prφΦiny s· teda znaky, ktorΘ nie s· pφsmenami Φi Φφslami zak≤dovanΘ do tvaru %XY , kde XY je hexadecimßlny ASCII k≤d danΘho znaku. U medzery sa m⌠₧e sta¥, ₧e nebude odovzdanß ako %20, ale ako znak + (plus). Aby ste sa nemuseli trßpi¥ s prßcnym nahrßdzanφm znakov vo vaÜom CGI skripte, Perl vßm na toto poskytuje prφkaz pack , ktor² vo vhodnom regulßrnom v²raze (o regulßrnych v²razoch si povieme v ∩alÜej Φasti, ke∩₧e ich budeme hojne vyu₧φva¥) zamenφ tieto ASCII k≤dy za prφsluÜnΘ znaky. Spomφnan² regulßrny v²raz vyzerß nasledovne:
$vstupne_data =~ s/%([dA-Fa-f][dA-Fa-f])/pack ("C", hex ($1))/eg;
Aby ste zabezpeΦili aj prevod znakov + na medzery, je potrebnΘ vlo₧i¥ pred tento reg. v²raz eÜte jeden:
$vstupne_data =~ tr/+/ /;
Spomφnal som tu met≤dy POST a GET, pomocou ktor²ch odovdßva klient dßta na vstup skriptu. Met≤du ktorß mß by¥ pou₧itß zadßvate v atrib·te METHOD tagu FORM. Ak² je medzi t²mito dvoma met≤dami rozdiel?
Met≤da GET preberß dßta z premennej prostredia QUERY_STRING. Je defaultnou met≤dou pou₧φvanou pri naΦφtavanφ dßt do CGI skriptu. Ke∩ teda zavolßte skript pomocou URL http://www.mojserver.sk/cgi-bin/skript.cgi?vstup=data ,
na naΦφtanie t²chto dßt sa pou₧ije met≤da GET, ktorß ulo₧φ do premennej $ENV{QUERY_STRING} re¥azec vstup=data .
Met≤da POST posiela dßta na vstup CGI skriptu pomocou ÜtandardenΘho vstupu. Pri naΦφtanφ dßt zo Ütand. vstupu musφte skriptu poveda¥, ko╛ko dßt (v bajtoch) mß naΦφta¥. Toto samozrejme neviete vopred urΦi¥ (napr. v prφpade, ke∩ u₧φvate╛ posiela z formulßru odkaz, ktor² svojφm skriptom spracovßvate). Ak si vÜak spomφnate, existuje premennß prostredia s nßzvom CONTENT_LENGTH, ktorß obsahuje prßve ve╛kos¥ vstupn²ch dßt.
Nasleduje perlovsk² skript, ktor² vyu₧φva vÜetko, Φo sme si doteraz povedali. Sprac·va vstup jednoduchΘho formulßra, ktor²m je u₧φvate╛ vyzvan² na zadanie mena. Zistφ met≤du, ktorou s· dßta odovzdßvanΘ, preΦφta dßta, dek≤duje ich a na ich zßklade vygeneruje dokument, ktor² u₧φvate╛a pozdravφ (ako prφklad vhodnΘ :).
$metoda = $ENV{REQUEST_METHOD};
if ($metoda eq "GET") {
$data = $ENV{QUERY_STRING};
} else {
read (STDIN, $data, $ENV{CONTENT_LENGTH});
}
($nazov, $meno) = split(/=/, $data);
$meno =~ tr/+/ /;
$meno =~ s/%([dA-Fa-f][dA-Fa-f])/pack ("C", hex ($1))/eg;
print "Content-type: text/plain";
if (!$meno) {
print "Aj ke∩ si sa nepredstavil, vitaj!";
} else {
print "Vitaj $meno!";
}
Pozrite si ako to vyzerß v praxi.
Myslφm ₧e pochopi¥ tento prφklad nie je zlo₧itΘ, tak₧e zdr₧φm sa vysvet╛ovania.
Ako som u₧ s╛·bil, nabud·ce si povieme o regulßrnych v²razoch, ktorΘ s· jednou z najsilnejÜφch zbranφ Perlu.
|
|
|