Autor Zpráva
jannie
Profil *
Ahoj, mám napsaný systém v PHP pro přidávání aktualit. Klasický nadpis a text aktuality. Přičemž nyní potřebuji nějak zakomponovat do textu možnost jednoduchého formátování (tučné písmo, přidávání odkazů, kurzíva).
Napadlo mi napojit to na tinymce, výsledek byl ten, že se mi ukládála i html kod do databáze, místo různých značek tam byly všelijaké entity, ale při zpětném výpisu to vypisovalo opět s HTML značkami.

Před vstupem do databáze se mi text aktuality vždy projede htmlspecialchars, mysqlescapestring a trimem. Avšak i když jsem tyto úpravy zrušila, tak se mi zpětně html text nezobrazil.

Neevíte, kde je chyba? Případně se ani nebráním napsat si nějak vlastní formátování...např. tučné písmo by bylo takto: [] tucne pismo [], ale nemám bližší představu, jak to udělat. Nemohl by mi někdo popostrčit, co s tím dál...
Str4wberry
Profil
A co se zobrazilo? V databázi ten text je uložen s HTML značkami, tj. nejsou před uložením odstraněny?
jannie
Profil *
Špatně vyjádřeno. Nová otázka:

Pokud nebudu používat htmlspecialchars a mysql_real_escape_string. Tak se mi do db budou ukládat i html značky. Při výpisu pak normálně fungují. Samozřejmě ale není to bezpečné. Ovšem přístup k tomuto přidávání má pouze administrátor. Otázka zní? Mám to nechat takto a ukládat do db html, když je administrace zaheslována? Nebo to lze nějak udělat, aby se to do db ukládalo bezpečně ale při výpisu z db, aby zase html fungovalo a zadaný text se oformátoval.?


Pokud používám pro ukládání do db výše uvedené funkce a poté to chci zpětně vypsat, vypíše se to přesně takto: <b>bold</b>


mohu použít při výpisu htmlspecialchars_decode($str); ale nevím, zda je to bezpečné...
jenikkozak
Profil
jannie:
Pokud nebudu používat htmlspecialchars a mysql_real_escape_string.
Mícháš dvě věci dohromady:
1) Htmlspecialchars způsobuje, že HTML značky se přepíšou na entity. Pokud to nechceš, tak to nepoužívej.
2) Druhá funkce - mysql_real_escape_string ošetří zadané řetězce escapováním tak, aby nemohlo dojít k narušení činnosti skriptu. Umožní ti to do databáze vkládat apostrofy a uvozovky jako řetězec, ne však jako součást řídících příkazů. A to chceš.
jannie
Profil *
chci hlavně to, aby se vše do db ukládalo bezpečně a aby se to při výpisu na stránku správně formátovalo, takže bude podle mě nejlepší řešení napsat si vlastní jednoduché formátování (speciální značky) a při výpisu tyto značky zaměňovat zpět za html...
jenikkozak
Profil
jannie:
chci hlavně to, aby se vše do db ukládalo bezpečně a aby se to při výpisu na stránku správně formátovalo, takže bude podle mě nejlepší řešení napsat si vlastní jednoduché formátování (speciální značky)
Povyměňováním ostrých závorek v databázi na hranaté či kulaté nebo jinou úpravou HTML bezpečnost nezvýšíš (snad leda vyházením apostrofů či uvozovek okolo atributů tagů). Co vlastně se ti na mysql_real_escape_string nelíbí?
Str4wberry
Profil
Jak správně naznačuje jenikkozak, HTML značky v databázi nekoušou. Funkce mysql_real_escape_string je ochrana před vytvořením nekorektního (potenciálně bezpečnostně rizikového) SQL dotazu.

Nemá moc smysl použít pro ukládání jiné značky než HTML, má-li být výstupem právě HTML.
jannie
Profil *
ok, děkuji za názor. Jde mi hlavně o tu bezpečnost. Formátování postačí základní + tvorba odkazů. Tak jen teoreticky.

Pokud ponechám možnost ukládat do db html značky - nepoužiji funkci htmlspecialchars, může potenciální útočník do db uložit i např. iframe, form atd.

Pokud si zvolím své značky pro formátování a ponecham jen základní formátování, b,i, a odkazy a použiji funkci htmlspecialchars, tak je to přeci lepší, ne?

Mysql_real_escape_string používám v každém případu. Htmlspecialchars řeší spíš XSS.

Každopádně děkuji za diskusi.
Tori
Profil
jannie:
může potenciální útočník do db uložit i např. iframe, form atd.
a od toho tu je funkce strip_tags, které dáte seznam přípustných tagů (a případně regulárem vyhážete nežádoucí atributy z povolených tagů. Jinak i u TinyMCE se dá nastavit seznam povolených tagů a jejich atributů, ale stejně byste to musela kontrolovat i v PHP.
jannie
Profil *
Díky za tip!
jannie
Profil *
Tak přihodím ještě odkaz, že né vždy se strip_tags chovají tak jak by se očekávalo:
www.reddit.com/r/PHP/comments/nj5t0/what_everyone_should_know_about_strip_tags/
Tori
Profil
jannie:
Zajímavý odkaz, díky za něj. Nicméně s mnoha věcmi, které autor napsal, se dá polemizovat. Strip_tags() je jen nástroj, ne umělá inteligence (aby třeba rozeznal <můj vlastní XML tag> od x < (y + 1)), a jako takový je na něco vhodný a na něco ne. Ale taky bych ráda, kdyby strip_tags podporovalo i syntaxi <tag />. :-/
Použití bbcode značek a htmlspecialchars+převod na HTML před uložením do DB mi připadá méně náchylné k podstrčení nežádoucího obsahu, ale zas se musí ošetřit, aby to někdo nerozbil v bbcode.
Rado
Profil *
jannie:
Možná jsem vedle, ale pokud chceš formátovat text pomocí html tagů a přitom je nechceš ukládat do databáze, stačí prostě použít htmlspecialchars při ukládání a htmlspecialchars_decode při tahání z databáze. Nejsem moc odborník, takže nevím o případných nebezpečích, nicméně to funguje :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: