Autor | Zpráva | ||
---|---|---|---|
jannie Profil * |
#1 · Zasláno: 12. 1. 2012, 15:35:14
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 |
#2 · Zasláno: 13. 1. 2012, 04:04:02
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 * |
#3 · Zasláno: 13. 1. 2012, 14:49:20 · Upravil/a: jannie
Š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 |
#4 · Zasláno: 13. 1. 2012, 15:49:39
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 * |
#5 · Zasláno: 13. 1. 2012, 15:53:39
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 |
#6 · Zasláno: 13. 1. 2012, 16:14:00 · Upravil/a: jenikkozak
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 |
#7 · Zasláno: 13. 1. 2012, 16:32:35
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 * |
#8 · Zasláno: 13. 1. 2012, 17:17:41
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 |
#9 · Zasláno: 13. 1. 2012, 17:29:41
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 * |
#10 · Zasláno: 13. 1. 2012, 19:58:51
Díky za tip!
|
||
jannie Profil * |
#11 · Zasláno: 13. 1. 2012, 21:04:39
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 |
#12 · Zasláno: 13. 1. 2012, 21:27:22
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. |
||
Časová prodleva: 8 měsíců
|
|||
Rado Profil * |
#13 · Zasláno: 29. 8. 2012, 13:23:52
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 :) |
||
Časová prodleva: 12 let
|
0