http://www.mazlo.org - Osobní stránky Jiřího Zamazala  

Zabezpečení vstupních formulářů v PHP

Hodně začátečníků, kteří začínají s PHP (+MySQL) se snaží udělat vlastní scripty a dají si je na svůj web. Bohužel řada z nich si neuvědumuje, že bezpečnost některých scriptů je nulová ...

Úvodem

Klasický případ je Návštěvní kniha jinak nazývaná jako GuestBook či jenom gbook. Snad každý si chce na svůj web dát vlastní návštěvní knihu a být tak nezávislí na cizích službách. Celý script si můžeme rozdělit do těchto logických částí:

Většina chyb se nachází právě v druhé části, protože hodně začátečníků si myslí, že data stačí jenom někam uložit a tím jejich práce končí.

Zakázání HTML tagů

Buhužel s weby, které mají povolené HTML tagy se setkávám čím dál častěji. Do formuláře (konkrétně TEXTAREA) stačí napsat libovolný tag a ejhle, on funguje. Připadá mi to jako dost brutální chyba, protože stačí napsat:

<IMG src="nějaká adresa">
<IFRAME src="http://libovolná adresa">

Možnosti jsou prakticky neomezené. Pokud je stránka dělaná pomocí tabulek, stačí přihodit pár tagů <TR> <TD> <TABLE> či </TABLE> a udělá to pěknou paseku. U stránek dělaných pomocí CSS stačí přidat pár </DIV> a nebo vložit nové <DIV> s existujícím ID nebo CLASS. Možností je opravdu mnoho ... :D

Super, tak jsme si řekli, že povolené HTML nejsou to pravé ořechové. Ale co s tím?
Představte si, že máte proměnnou $text, ve které máte uložený příspěvek. Nyní se koukněte do zdrojáku své návštěvní knihy a nejděte si místo, kde se příspěvek někam ukládá (buď soubor nebo databáze). Před tímto uložením stačí do zdrojáku napsat tento kód:

$text = strip_tags($text);

Tímto kódem smažete všechny HTML tagy. Představte si ale, že by někdo chtěl napsat HTML tag do návštěvní knihy a potřebuje, aby ho ostatní viděli. K tomu nám poslouží funkce htmlspecialchars:

$text = htmlspecialchars($text);

Tento kód převede znaky jako např. < a > na HTML entity. Pokud nevíte, co to jsou HTML entity, tak jukněte na www.jakpsatweb.cz

Zalamování řádků

Naší návštěvní knihu jsme sice již zabezpečily proti HTML tagům, ale ještě nám zbývá jedna malinkatá věcička. Pokud návštěvník napíše řetězec znaků a neoddělí je mezerou, text se v příspěvkách nezalomí. Výsledně to pak vypadá tak, že text přetéká (přes tabulku nebo div) a někdy může dojít k pěkné deformaci stránky :D. A tak do našeho zdrojáku přidáme další řádek kódu a použijeme funkci WordWrap:

$text = WordWrap($text, 30, " ", 1);

Zápis této funkce muže být různý, ale já jsem použil toto. Pro použití stačí zkopírovat a vložit do Vašeho zdrojáku :))

Závěrem

Samozřejmě existují i jinačí způsoby zabezpečení, o kterých napíšu možná později. Možná si říkáte, že by se přece jenom hodilo povolit nějaké formátovací HTML tagy (např. <B> <STRONG> <I> <U> ...), ale o tom napíšu zas někdy příště ... ;]

Kategorie: Web a vše kolem něj ≈ 15. 11. 2005 ≈ Počet zobrazení: 11147x

Komentáře

Napsat komentář





;) :-P :-) :D 8-) :-O :( :-X .-)

  • Povinné údaje jsou zvýrazněny tučným písmem!
  • Formátování textu:
  • Povolené typy odkazů (příklady):
    • www.mazlo.org, http://www.mazlo.org či jen http://mazlo.org
    • https://www.t-zones.cz
    • ftp.slackware.cz (není povoleno ftp://ftp....!)
    • Za odkazem dělejte vždy mezeru!
  • Enter znamená nový řádek
  • Po 45 znacích ve slově se vytvoří mezera (vyjma odkazů)
  • RSS export komentářů tohoto článku
peCan [188] -- 15. 11. 2005 19:29:17
No, s div+table jsem nikdy problemy nemel, ale s loooooooooong words jo. pouzival jsem $text = WordWrap($text, 30, "\n", 1); ale tvoje reseni je myslim si lepsi ;)
pecan (zavinac) yo.cz | www | Reagovat
Mazlo [190] -- 15. 11. 2005 20:14:11
peCan
Mno když dáš </table> u tabulkovýho layoutu s patičkou, tak patička zmizí :D Stejně tak i u </div> 8-) Někdy se mi povedlo udělat z validní stránky (xHTML) stránky se 150 chybami :-) Stačilo je "pár" </div>
Jinak ten tvůj WordWrap taky není špatnej, ale vadilo mi, že to hodí na novej řádek, přece jeno ta mezera je hezčí
;)
Webmaster | Kontakt | Reagovat
peCan [192] -- 16. 11. 2005 08:39:11
jinak 30 znaku je hrozne malo. (nekdo posle url a rozseka se to... pak hledej mezery.) proto mam 60 znaku. do designu se to vleze, tak proc ne. 8-)
dr.merlin [195] -- 17. 11. 2005 15:27:47
Jako administrátor webu, bych se nebál vkládaných HTML tagů jako spíše 'escape' sekvencí jazyka SQL. Pokud ti někdo přidá do dotazu středník, může potom následovat pustošení databáze (drop, create user apod.). Třeba Java má proti tomu ochranu v podobě předkompilovaných dotazů, kdy doplňuješ jenom parametry. U PHP je nebezpečné znaky nutno filtrovat (nahradit) nebo odstranit.

Daleko častější chybou je opakovaný zápis do databáze. Kdy uživatel stiskem F5 odešle data znovu - napadá mě několik řešení, ale můžeš se zamyslet sám a napsat pěkný článek 8-)
IM: 143-650-045 | Reagovat
Mazlo [196] -- 17. 11. 2005 15:45:40
dr.merlin
Mě napadlo jen jedno řešení:
Odeslat data na jinačí stránku, kde se data zapíší do databáze a pak pomocí header("Location: URL"); přesměrovat zpět na formulář s příspěvkama. Po stisknutí F5 se už nic neodešle (nezapíše) :]
Jinak díkes za námet - mohl bych napsat něco o escape sekvencích :D
Webmaster | Kontakt | Reagovat
DR.LOGic [290] -- 19. 12. 2005 13:14:47
pěkný :-)
dr.logic (zavinac) atlas.cz | www | Reagovat
beazt [291] -- 19. 12. 2005 13:16:13
máš tam chybu v textu v sekci Závěrem:

Samzřejmě existují i jinačí způsoby....
Mazlo [292] -- 20. 12. 2005 16:36:38
beazt: Díky, opraveno :]
Webmaster | Kontakt | Reagovat
Littlemaple [553] -- 17. 02. 2006 18:42:12
Gramatických chyb je tam poněkud více ;). Jinak strip_tags je celkem nevhodné pro tyto účely, htmlspecialchars bych více vyzvedl jako to "jediné a úžasné" řešení :-). Chybí mi tam ještě kontrola vkládání prázdných řetězců, kdy skript může kontrolovat, jestli je řetězec prázdný, či ne, ale je třeba nejdříve použít funkce trim na jeho osekání od bílých znaků na začátku a na konci.
Lukáš Hakoš [894] -- 11. 06. 2006 15:07:45
Jo, podobných formů existuje mnoho a bohužel někdy i na docela dost velkých webech, kde toho trochu zneužít a fatální chyba je na světě.
autor (zavinac) lukas-hakos.com | www | IM: 346894104 | Reagovat
sdf [1384] -- 04. 02. 2007 01:30:44
js ajsjasasas
sdfsdf | IM: sj s | Reagovat
Mujfibi [1420] -- 14. 03. 2007 08:18:35
libi se mi co delas
 
 
kk [1491] -- 23. 08. 2007 00:07:46
fhgh
[1489] -- 08. 08. 2007 19:33:18
kk [1490] -- 23. 08. 2007 00:07:21
zk
Tommy [1535] -- 20. 04. 2008 17:41:49
Jak mám přesněji použít
$text = htmlspecialchars($text);
? Chci pouze, aby mi tam šli smajlíci (takže obrázky) a nějaký ten <b> atd.
Díky za rady.
neumanntomas (zavinac) email.cz | www | Reagovat

Navigace

Kategorie

RSSad.cz: Chyba číslo 407 - Nejde načíst cacheRSSad.cz: Chyba číslo 407 - Nejde načíst cache

© 2005 - 2006 Jiří Zamazal alias Mazlo | Web pohání MRSS 1.0 | XHTML 1.0 Strict | Valid CSS | RSS: články / komentáře |