Vytváření živých stránek

Stručná osnova příspěvku na seminář.
Ondřej Bojar, http://www.cuni.cz/~obo, obo@cuni.cz

Technologie na straně klienta

Technologie na straně serveru

SSI, Server Side Includes

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-skripty, Common Gateway Interface

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 URL http://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áva 755 rozhodně fungují. Kapku bezpečnější by byla práva 711, ale možná pak CGIWRAP nedokáže skript spustit.

Spustitelné programy lze napsat přímo v C (kompilátor gcc, debugger gdb nebo dbx, Pascalu (kompilátor pc) ap. a zkompilovat. Snazší možností je napsat skript v nějakém interpretovaném jazyce či skriptovacím jazyce (shelly bash či csh, jazyk perl 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 text Content-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_STRINGu, 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.

PHP, http://www.php.net/

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á.


Ondřej Bojar. 4. 5. 2000