Jsou to již dva měsíce, co jsem napsal něco málo o zabezpečení vstupních formulářů v PHP. Ke konci článku jsem přislíbil, že bude mít pokračování, tak tady ho máte
.
Povolení některých html tagů
Předtsavte si, že máte návštevní knihu, forum a nebo třeba komentáře, kde ostatní píší své náměty, připomínky atd. A někdy je potřeba něco zvýraznit či oddělit. Na druhou stranu zas nechcete povolit všechny HTML tagy. Návod je prostý ;)
Ve vstupním formuláři (třeba i za pomocí JavaScriptu) návštěníka informujete, že [B]něco[/B] znamená <b>něco</b>, tedy vlastně <strong>něco</strong>, pokud má mít zvýrazněný text sémantický význam ;)
Dejme tomu, že máte proměnnou $text, ve které je uložen příspěvek. Pak stačí do scriptu vložit:
$text = Str_Replace("[B]","<strong>",$text);
$text = Str_Replace("[/B]","</strong>",$text);
Stejně tak můžeme pokračovat ve stejném duchu ...
$text = Str_Replace("[I]","<em>",$text);
$text = Str_Replace("[/I]","</em>",$text);
Poznámka pro lamery: Najděte si místo ve zdrojáku, kde je vložení příspěvku do databáze a tento "kód" vložte před to. Vycházíme z předpokladu, že příspěvek je v proměnné $text!
Jinak myslím, že je jasné, jak funkce Str_Replace funguje ;) Vyhledá v proměnné řetězec znaků a ten nahradí jiným řetězcem znaků.
Smajlíci pomocí Str_Replace
Funkce Str_Replace se samozřejmě dá využít i na jiné věci, třeba na převod textového smajlíku na grafický smajlík (obrázek) ;)
$text = Str_Replace(":)"," <img src=\"smiles/smajlik.gif\" alt=\":)\"/>",$text);
Převedení & na &
Pokud máte validní web, jistě Vás naštve, když uživatel do formuláře návštěvní hnihy napíše &, protože Vám vznikne nevalidní web ;-)
$text = Str_Replace("&","&",$text);
Nový řádek
Chcete, aby, když uživatel stiskne enter při psaní ve formuláři, se v příspěvku vložil nový řádek? Není problém ... ;)
$text = Str_Replace("\n","<br />",$text);
Zakázání html tagů
Pomocí funkce Str_Replace můžeme zakázat všechny html tagy:
$text = Str_Replace("<","<",$text);
$text = Str_Replace(">",">",$text);
Varování
Chci Vás předem varovat na jeden problém, na který jsem narazil ;-)
Pokus budete chtít použít všechny příklady, které jsem zde uvedl, musíte si dát pozor na pořadí! Představte si, že by bylo nejdříve převedení HTML tagů na HTML entity. Ze zápisu <tag> by vzniklo <tag>. Pokud byste za tuto funkci dali funkci na Převedení & na &, udělala by vám z toho pěknou paseku ;) To mi věřte, vím to z vlastní zkušenosti
.
Pro jistotu uvedu celý zdrojový kód ve správném pořadí. Předem se chci vyhnout debatám na ICQ :-)
$text = Str_Replace("&","&",$text);
$text = Str_Replace("<","<",$text);
$text = Str_Replace(">",">",$text);
$text = Str_Replace(":)"," <img src=\"smiles/smajlik.gif\" alt=\":)\"/>",$text);
$text = Str_Replace("[B]","<strong>",$text);
$text = Str_Replace("[/B]","</strong>",$text);
$text = Str_Replace("[I]","<em>",$text);
$text = Str_Replace("[/I]","</em>",$text);
$text = Str_Replace("\n","<br />",$text);
Uff, to by mělo být vše ;)
Kategorie: Web a vše kolem něj ≈ 08. 01. 2006 ≈ Počet zobrazení: 6579x
Simon [
360] -- 08. 01. 2006 00:41:24
Dobrý, ještě sehnat návod na vytvoření návštěvní knihy 
Králik [
951] -- 01. 07. 2006 11:21:36
Moc diky, moc, moc, moc mco moc
uz sem myslel ze na str replace seru, ale diky admine tohoto clanku
uz mi to funguje :)
Králik [
956] -- 02. 07. 2006 09:10:06
Návod?? LOL ja jsem lamka a www.povidky.wz.cz/guestbook jsem admin ;-)
nd [
1315] -- 27. 11. 2006 19:55:02
Mazlo [
361] -- 08. 01. 2006 00:47:47
Simon: Třeba se někdy dočkáš 
Miloso [
362] -- 08. 01. 2006 12:50:28
Moc hezký článek, ukládám do záložek, jednou se možná bude hodit 
Acci [
363] -- 08. 01. 2006 13:59:41
Nechci rýpat, ale tohle:
$text = Str_Replace("\n","<br />",$text);
lze řešit mnohem lépe:
$text = nl2br($text);
Také
$text = Str_Replace("<","< ;",$text);
$text = Str_Replace(">","> ;",$text);
lze řešit lépe:
$text = htmlspecialchars($text)
Zároveň to taky převede & na & amp;
Mazlo [
364] -- 08. 01. 2006 14:09:08
to Acci:
Funkci nl2br() vidím poprvé v životě ... Díky za novou informaci
Jinak funkci htmlspecialchars() jsem popsal v minulém článku (viz odkaz nahoře v článku) 
peCan [
365] -- 08. 01. 2006 18:28:59
priste napis o wordwrap(); a jak to cele komplet s tim co uz jsi psal pouzit, aby to zabralo co nejmin mista v databazi a nedostalo se ti tam neco, co zrovna nepostrebujem:-)
Mazlo [
366] -- 08. 01. 2006 18:40:36
to peCan: o funkci wordwrap() jsem již psal
Ale není špatné to vše shrnout dohromady
A ještě bych to mohl skloubit s escape sekvencema 
dr.merlin [
368] -- 12. 01. 2006 22:09:58
Pracoval jsem na jedné seminární práci (v Javě), kde jsem používal podobný systém "záměny" hodnot. Docela se mi osvědčilo uložit dvojice hodnot (původní=nahrazující) do textového souboru. Má to výhodu, že jej můžete kdykoliv jednoduše editovat a nemusíte se "hrabat" v kódu. Soubor stačí potom jen načíst do kolekce (klíč=hodnota) a poté projít vkládaný text. Podobnou funkcionalita můžete vytvořit jako třídu, kterou potom lze použít na dalších projektech.
Kašpy [
370] -- 14. 01. 2006 11:46:48
Zdravim tě,
proč si nepoužil pole?
<?php
$text = str_replace($pole1,$pole2,$tex t);
?>
Myslim, že by to bylo názornější - představi si že bych rozepisoval každej tag, a ještě jedna věc tvuj příklad je case-sensitive takže pokud bych zadal [ b ] a [ /b ] tak by se nic nestalo a navíc pokud bych měl text třeba takovýto:
$text = "<i>xxxxxxxx<b>" ;
tak ti to zformátuje všechno i a pak i a b takže raději funkce preg_replace
Atlasx (zavinac) seznam.cz |
www |
IM: 226547822 |
Reagovat
Mazlo [
372] -- 14. 01. 2006 15:15:10
to dr.merlin: Souhlasím
to Kašpy: Díky
btw: Sakryš, někdy si připadám jak totální lama 
Kašpy [
378] -- 15. 01. 2006 10:21:20
|btw: Sakryš, někdy si připadám jak totální lama|
Nechtěl sem tvoje dílo nějak znehodnotit jen sem poukázal na to, že to jde jinak.
Atlasx (zavinac) seznam.cz |
www |
IM: 226547882 |
Reagovat
Mazlo [
381] -- 15. 01. 2006 20:26:55
to Kašpy:
Já vím, jaks´s to myslel
Ale stejně jsem lama 
Binduch [
412] -- 23. 01. 2006 21:42:59
Podle me uplne nejlepsi je neprevadet jen \n na <br /> ale prevadet na break i odentrovani, pac by me zajimalo, kterej laik ti napise do gb '\n' A taky je potreba osetrit uvozovky...
binduch (zavinac) seznam.cz |
IM: 117674592 |
Reagovat
Mazlo [
413] -- 23. 01. 2006 22:20:55
to Binduch:
'\n' znamená stisknutý Enter ve formuláři
Ano, o escapování proměnných taky někdy napíšu, ale teďka ne ... 
Littlemaple [
555] -- 17. 02. 2006 18:50:45
Kašpy má pravdu, v tomto se dá nádherně regulárně rochnit a výsledky budou vychytanější
. Ale jako úvod do problematiky dobré.
nofate [
1389] -- 15. 02. 2007 18:33:50
Peknej navod, fakt. Akorat pro nahradeni \n za br nepouzivam str_replace ale nl2br
nofate [
1390] -- 15. 02. 2007 19:26:32
Mno ještenasledovni 3 radky:
$text = Str_Replace("&","&a
mp;",$text);
$text = Str_Replace("<","<
;",$text);
$text = Str_Replace(">",">
;",$text);
bych nahradil jednim a bezpecnejsim:
$text = htmlspecialchars($text);
Proc si kmplikovat zivot a zbytecne prasit ve skriptech... ;-)
piugklug [
1397] -- 01. 03. 2007 16:00:06
<lugtiu > iougioug
jiji (zavinac) seynam.cy |
IM: <uygu |
Reagovat
xxxx [
1432] -- 03. 04. 2007 03:38:51
xandy (zavinac) xapi.rc |
IM: 22554477 |
Reagovat
Greeg [
1433] -- 03. 04. 2007 03:43:34
ještě bych to doplnil na začátku o funkci trim(); která odstraní prázdné znaky, aby si věděl, že jsem do poviného pole neudělal jen dva "Entery"
if (trim($text) == "") {
echo "Musíš pole vyplnit!";
exit;}
blazen [
1458] -- 19. 04. 2007 02:54:03
hele proc mi nejde
$text = str_replace("\n","<br />",$text)??
blazen [
1459] -- 19. 04. 2007 02:55:09
poradite mi? proc mi nefunguje odradkovani a pouzivam to presne jako je to tady?
blazen [
1460] -- 19. 04. 2007 02:55:51
jen zkousim zda vam to tu funguje
aaa
aaa
Dudu [
1471] -- 13. 05. 2007 21:12:56
Cool, to sem přesně hledal
Btw, mily mazlo, mam Te v kontaktech, nevim proc sem si te pridaval, ale asi to bylo neco ohledne PHP. Totiz desne zapominam
Az budu neco potrebovat ohledne PHP, ozvu se 
dudlitko@jabber.cz
dudu_us (zavinac) centrum.cz |
www |
IM: dudlitko@jabber.cz |
Reagovat
Jára [
1504] -- 01. 12. 2007 20:33:49
Mám problém, když v mý návštěvní knize zadám např: [b] a neukončím ho, tak mi ztuční i všechny ostatní vzkazy stránky. Jak to ošetřit?
Díky moc
jsk [
1507] -- 20. 12. 2007 19:20:42
Dobrý den,
líbí se mi to, jen mi to nejde použít na text uložený v souboru, spíše mi ho to celý vymaže. Otevřu, načtu změním a mám prázdný (0kb) soubor.
Za radu díky předem.
jsk
Pokus [
1521] -- 01. 03. 2008 14:03:39
[bpokus
Pokus [
1522] -- 01. 03. 2008 14:03:58
[b]pokus
DaVidEk.S [
1531] -- 22. 03. 2008 17:57:58
Výborny návod musim ho skusit !!!
davidek.s (zavinac) emial.cz |
IM: 342572302 |
Reagovat
DaVidEk.S [
1532] -- 22. 03. 2008 18:03:14
Tak sem to vyzkousel ale nejak to nejde :( help me !!!
<?
$text = Str_Replace("&","&a
mp;",$text);
$text = Str_Replace("<","<
;",$text);
$text = Str_Replace(">",">
;",$text);
$text = Str_Replace(":)"," <img src=\"smiles/smajlik.gif\" alt=\":)\"/>",$text);<
br
/>
$text = Str_Replace("","<stro
ng>",$text);
$text = Str_Replace("[/B]","</st
rong>",$text);
$text = Str_Replace("","<em&g
t;",$text);
$text = Str_Replace("","</em
>",$text);
$text = Str_Replace("\n","<br />",$text);
$text = '[b]Vytvořen nový web ;<<<<<<<<<<
)<br>Zacatky
noveho webu se blizi:!!<br><br>Makám na zmenach dejte mi tyden :P<br>Chyby v toplistu se brzo opravi jen delam ted kostru a menu atd.. toplist se upravi potom <br><br><br><br></
div>
';
echo ' ', $text,' ';
?>
davidek.s (zavinac) emial.cz |
IM: 342572302 |
Reagovat