Stručná osnova příspěvku na seminář.
Ondřej Bojar, http://www.cuni.cz/~obo, obo@cuni.cz
Konrétně na dec59.ruk.cuni.cz je serverem Apache (http://www.apache.org/) a požadavky o vložení něčeho mají tento tvar:
<!--#include file="cesta/a/jmeno/souboru"-->
<!--#include URL="http://www/soubor"-->
- mělo by požádat o text k vložení znovu nějaký WWW server, moc mi to nefungovalo
<!--#exec cmd="cesta/a/jmeno/programu"-->
- spustí uvedený program a jeho standardní výstup vloží do odesílané stránky
- musíte mít od správce povolený tzv.
XBitHack
(viz popis u Apachů)- ...a pravděpodobně další, viz u Apachů
/cgi-bin/
)
Uživatelské CGI skripty
Vzhledem k bezpečnostním rizikům jsou typicky všechny CGI-skripty skladovány pro celý server v jediném adresáři. (Konkrétně/usr/infos/www/cgi-bin/
.) Do tohoto adresáře však nedostane přístup hned tak někdo, a proto jednotliví uživatelé mají navíc možnost vyrábět vlastní, uživatelské, skripty umístěné v adresáři~/public_html/cgi-bin/
. O spuštění uživatelských skriptů se postará centrální skript CGIWRAP.Např. můj skript
~uzivatel/public_html/cgi-bin/pokus
se spustí, když server požádám o URLhttp://www/cgi-bin/cgiwrap/uzivatel/pokus
CGI skript musí být spustitelný
Tj. mít přístupová práva, jež ho dovolí spustit. Nevím přesně jaká práva, ale práva755
rozhodně fungují. Kapku bezpečnější by byla práva711
, ale možná pak CGIWRAP nedokáže skript spustit.Spustitelné programy lze napsat přímo v C (kompilátor
gcc
, debuggergdb
nebodbx
, Pascalu (kompilátorpc
) ap. a zkompilovat. Snazší možností je napsat skript v nějakém interpretovaném jazyce či skriptovacím jazyce (shellybash
čicsh
, jazykperl
ap.) a jako první řádku mu napsat odkaz na interpret (#!/usr/bin/bash
,#!/usr/bin/csh
,#!/usr/ucb/perl
). Nezapomenout nastavit práva pro spuštění.Skript lze tedy snadno vyzkoušet. Přímo v shellu ho můžete spustit a podívat se, jaký přesný výstup vrací.
CGI skript musí vracet i HTTP hlavičku
Výstup skriptu je klientovi odeslán rovnou, aniž by server nějak označoval, co dokument obsahuje. Označení tedy musí provést sám skript tím, že ještě před textem stránky vytiskne na výstup textContent-type: text/html
a jednu prázdnou řádku.Úplnější hlavička HTTP může vypadat takto:
Content-type: text/html; charset=iso-8859-2 Content-length: 4321 Language: cs Tady je prázdná řádka!QUERY_STRING, Podrobnější požadavky od klienta
Je-li skript určen jako akce (ACTION
) nějakého formuláře (<FORM>
), dostane vyplněný obsah formuláře v tzv.QUERY_STRING
u, tj. v takto pojmenované proměnné prostředí. (Je to ten text, který bývá vidět v URL za otazníkem dál.) Z QUERY_STRINGu si skript musí obsah formuláře vypárat.Pozn.: Pokud je u formuláře vyznačeno
METHOD=POST
(a nikoli implicitníGET
), nedostane skript obsah formuláře v proměnné QUERY_STRING, ale na standardní vstup. Vypárání se ale musí provádět stejné.Je-li skript napsán přímo v shellu, lze k vypárání užít program
quextr
(mám ho jen já, není instalován pro všechny), např. takto:
set jmeno=`quextr "jmeno" "$QUERY_STRING"`
Obecně je však právě toto místo skriptu největšími bezpečnostními vraty.
.php3
.php3
nechá nechá napřed zpracovat interpretu php a vrátí až jeho výstup.
Př. 1: Obyčejná stránka, jen se táhne přes interpret php.
pokus1.php3:<HTML><H1>Ahoj.</H1></HTML>Př. 2: Stránka, v níž se vypíše QUERY_STRING.
pokus2.php3:<HTML><H1>Ahoj.</H1> Chtěls: <?php3 echo "$QUERY_STRING"; ?> </HTML>Př. 3: Stránka, na níž klient uvidí čísla od 1 do 10, ale autor byl líný je všechna psát.
pokus1.php3:<HTML><H1>Ahoj.</H1> <?php for ($i=1; $i <= 10; $i++) { echo "$i"; echo "<BR>"; } ?> </HTML>Př. 4: Formulář, který je sám sobě odpovědí. Navíc ilustruje prokládání php a výsledného HTML.
pokus1.php3:<HTML><H1>Ahoj.</H1> <FORM> Tady si něco zadej: <INPUT type=text name=blabla> <INPUT type=submit name="stisknul" value="Odeslat"> <?php if ($stisknul == "Odeslat"): ?> <P>Minule jsi vyplnil: <?php echo $blabla;?> <?php else: ?> <P>Ještě jsi nic nevyplnil! <?php endif; ?> </HTML>Zde je ukázková stránka v php3. A zde je ten kód v php, který to dělá.