Perl (82) - CGI - první skripty
Napíšeme první CGI skript a vysvětlíme jeho strukturu.
29.6.2009 01:00 |
Jiří Václavík
| Články autora
| přečteno 16937×
Na úvod poznamenejme, že CGI skripty mohou být napsané prakticky v jakémkoliv programovacím jazyce, který je na serveru (nebo počítači z něj dostupném) interpretovatelný. Lze použít například Perl, Python, Bash, C a máte-li nějaký vlastní jazyk, tak ten také. Právě s Perlem bylo CGI v minulosti spojováno velmi často.
Archiv CPAN nabízí několik modulů usnadňujících tvorbu CGI skriptů. O několik dílů později se jednomu takovému s názvem CGI budeme věnovat. Nyní však budeme postupovat bez podpůrných modulů, protože tak lze snáze problematiku pochopit.
První CGI skript
V každém nekompilovaném CGI skriptu musíme uvést několik věcí.
- pomocí čeho zpracovat skript (například pomocí Perlu - informace pro webový server)
- co je výsledkem našeho skriptu (HTML soubor, text, obrázek, atd. - informace pro nějaký klientův prohlížeč)
- samotný skript
Úvodní řádek určuje cestu k interpretu a vypadá následovně.
#!/cesta/k/interpretu
Dále je třeba pro webový prohlížeč na straně klienta uvést hlavičky dokumentu dle příslušného HTTP standardu. Zde uvedeme bez podrobnějšího vysvětlování jen to, co je nezbytně nutné.
Zopakujme, že nyní jsme v druhém bodu a uvedeme tedy, jaké povahy je výsledek interpretování. Je nutné specifikovat MIME typ zprávy. Zde záleží na tom, co budeme chtít, aby náš CGI skript generoval.
MIME je typ dat. Mezi základní kategorie datových typů patří application, audio, example, image, message, model, multipart, text a video. Každý z nich pak může nabývat různých podtypů. Pro čistý text použijeme MIME text/plain, pro text formátovaný v HTML text/html apod. Více o MIME typech lze nalézt na www.iana.org.
MIME typ uvedeme v hlavičce s názvem Content-type. Bude-li výsledkem CGI skriptu HTML dokument, pak jako druhý řádek CGI skriptu napíšeme toto.
print "Content-type: text/html\n\n";
Protože HTTP protokol vyžaduje prázdný řádek mezi hlavičkou a tělem zprávy, je mezi nimi sekvence "\n\n". Tím jsme dokončili část s hlavičkami a nyní tedy můžeme začít psát vlastní tělo programu.
Protože jsme uvedli jako MIME typ text/html, bude náš skript generovat HTML dokument - měli bychom tedy dodržet HTML strukturu (přesněji řečeno, webový prohlížeč to předpokládá a bude se podle toho chovat). Abychom přidali stránce "dynamičnost", zobrazíme aktuální čas.
my $now = localtime;
print << "HTML";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Hello World</TITLE>
</HEAD>
<BODY>
<H2>Hello world</H2>
$now
</BODY>
</HTML>
HTML
Nyní tento program spustíme nejprve v příkazovém řádku.
$ perl /usr/local/apache2/cgi-bin/hello.cgi
Content-type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Hello World</TITLE>
</HEAD>
<BODY>
<H2>Hello world</H2>
Sun Jun 18 19:02:38 2009
</BODY>
</HTML>
$
V podstatě se stalo přesně to, co bychom očekávali. Vygeneroval se nám HTML dokument s nějakou úvodní hlavičkou navíc.
Nyní můžeme zkusit spustit skript v prohlížeči. Pokud zadáme jako umístění /usr/local/apache2/cgi-bin/hello.cgi, zobrazí se zdrojový kód CGI skriptu (nikoliv jeho výstup a už vůbec ne interpretovaný HTML dokument).
Statické zobrazení obsahu souboru
Nyní spustíme CGI skript prostřednictvím webového serveru. Nastartujeme tedy webový server a do prohlížeče zadáme příkaz http://localhost/cgi-bin/hello.cgi. Pokud jde vše, jak má, měli bychom spatřit jednoduchou dynamicky vygenerovanou HTML stránku.
Dynamicky vygenerovaný HTML dokument
Tento CGI program je velmi jednoduchý. Hlavním důvodem je, že od uživatele nepřijímá žádná data a zpracovává pouze informaci serveru o aktuálním čase.
Pokud bychom zadali do hlavičky Content-type místo text/html například text/plain, práce pro server by zůstala stejná. Lišila by se však interpretace výsledku v prohlížeči. Jak by se takový dokument zobrazil, si můžete vyzkoušet nebo se podívat na obrázek.
Dynamicky vygenerovaný textový dokument
Pro představu doplňme, že hlaviček je mnohem více, než jen povinná výše používaná hlavička Content-type. A dokonce oproti předchozímu ani hlavička Content-type nemusí být uvedena. V takovém případě však je nutné uvést hlavičku Location, jejímž parametrem je odkaz na umístění. Ostatní hlavičky jsou volitelné. Zde máme příklad Location hlavičky, která přesměruje na www.linuxsoft.cz.
print "Location: http://www.linuxsoft.cz\n\n";
Ladění CGI skriptů
Než začneme psát další CGI skripty, je užitečné mít na vědomí, že CGI skript je stále perlový skript a že ho je možné stále spustit v textovém režimu. Zdůrazňujeme to proto, že WWW prohlížeč nám neukáže standardní chybový výstup a v případě chyby bychom mohli být překvapeni, proč se nic neděje.
Absence chybového výstupu je značný hendikep, neboť hledat chybu bez jakýchkoliv hlášení je mnohdy téměř nemožný úkol.
Dobrou a jednoduchou metodou pro ladění je spuštění CGI skriptu příkazem perl a sledovat výstup v konzoli. Jinou možností je kontrola log souborů apache. V /usr/local/apache2/logs/error_log bychom měli najít chybový výstup našich CGI skriptů.
Proměnné prostředí
Webový server obvykle nastavuje pro CGI skript některé speciální proměnné prostředí. Odtud můžeme čerpat zejména informace o serveru, ale jsou zde i položky, které charakterizují požadavek uživatele. Proměnné prostředí nám jsou v CGI programu přístupné z hashe %ENV. Tyto proměnné prostředí uvádí následující tabulka.
Je nutno podotknout, že záleží pouze na serveru, které proměnné budou dostupné. Také se mohou názvy proměnných v detailech lišit. Informace o serveru obvykle začínají prefixem SERVER_. Data o uživateli, který zaslal požadavek, jsou zase dostupná přes REMOTE_.
Proměnná | Hodnota |
REQUEST_METHOD | metoda vstupu dat |
QUERY_STRING | řetězec vstupních dat předaných metodou GET |
CONTENT_TYPE | typ dat od uživatele |
CONTENT_LENGTH | maximální délka vstupu pro metodu POST |
GATEWAY_INTERFACE | verze CGI ve formátu CGI/verze |
AUTH_TYPE | způsob autentifikace uživatele |
REQUEST_URI | URL bez doménového jména |
SCRIPT_FILENAME | cesta ke skriptu od adresáře / |
SCRIPT_NAME | cesta ke skriptu z pohledu serveru |
REMOTE_ADDR | IP ppočítače uživatele |
REMOTE_HOST | doménové jméno počítače uživatele |
REMOTE_PORT | port uživatele |
SERVER_ADDR | IP serveru |
SERVER_ADMIN | kontakt na administrátora serveru |
SERVER_NAME | doménové jméno serveru |
SERVER_PORT | port serveru |
SERVER_PROTOCOL | protokol a verze |
SERVER_SOFTWARE | jméno a verze serveru a modulů |
Nastavují se také proměnné podle přijatých hlaviček. Jsou tak dostupné například HTTP_ACCEPT, HTTP_ACCEPT_CHARSET, HTTP_ACCEPT_ENCODING, HTTP_ACCEPT_LANGUAGE, HTTP_CONNECTION, HTTP_COOKIE, HTTP_HOST, HTTP_USER_AGENT.
Pro konkrétnější představu o tom, jakých hodnot jednotlivé proměnné nabývají si předveďme jednoduchý CGI program, který vypíše obsahy proměnných prostředí.
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
foreach $p (sort keys %ENV) {
$h = $ENV{$p};
print "$p=$h\n";
}
CGI a bezpečnost
Při psaní webových aplikací si je dobré uvědomit, že každá neošetřená hodnota, která přijde od uživatele, je nakažená. Vždy předtím, než začneme pracovat s přijatými daty, je musíme vyléčit. Aby bylo ošetřování vynuceno, doporučuje se skripty spouštět s parametrem -T.
O nakaženém režimu již v rámci seriálu vyšel zvláštní díl.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|