vlastne CMS - ukladanie znaku &
vlastne CMS - ukladanie znaku &
Ahojte,
mam web s vlastnym CMS a mam problem so zobrazenim / ukladanim znaku & v textoch.
Ake je najlepsie riesenie, ak chcem aby:
- frontend vypisoval & (kvoli validite kodu)
- v DB je mi jedno ci bude & alebo entita & (navrhite, co je lepsie)
- v backende - v input/textarea musi byt zobrazene pre uzivatela &
Niektore texty su v backende editovane cez editor, je preto potrebne, aby sa html tagy ukladali ako html tagy (napr. <strong>ahoj</strong>), takze nestaci iba pouzit htmlspecialchars() na vsetko.
mam web s vlastnym CMS a mam problem so zobrazenim / ukladanim znaku & v textoch.
Ake je najlepsie riesenie, ak chcem aby:
- frontend vypisoval & (kvoli validite kodu)
- v DB je mi jedno ci bude & alebo entita & (navrhite, co je lepsie)
- v backende - v input/textarea musi byt zobrazene pre uzivatela &
Niektore texty su v backende editovane cez editor, je preto potrebne, aby sa html tagy ukladali ako html tagy (napr. <strong>ahoj</strong>), takze nestaci iba pouzit htmlspecialchars() na vsetko.
-
Michaelo
Hardcore addict
- Príspevky: 6177
- Registrovaný: 16 júl 2008, 20:29
- Bydlisko: Pri PC
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
Ja pouzivam toto:
Funguje dokonale.
Tam kde v Backende musis zachovat samotne znaky proste nepouzijes stripinput na vstup.
Kód: Vybrať všetko
function stripinput($text) {
if (!is_array($text)) {
$text = preg_replace("/(&)+(?=\#([0-9]{2,3});)/i", "&", $text);
$search = array("&", "\"", "'", "\\", '\"', "\'", "<", ">", " ");
$replace = array("&", """, "'", "\", """, "'", "<", ">", " ");
$text = str_replace($search, $replace, $text);
$text = trim($text);
} else {
foreach ($text as $key => $value) {
$text[$key] = stripinput($value);
}
}
return $text;
}
$input = stripinput($_POST['lalala']);Tam kde v Backende musis zachovat samotne znaky proste nepouzijes stripinput na vstup.
Re: vlastne CMS - ukladanie znaku &
Dakujem Michaelo,
ale ako potom docielim, aby to fungovalo aj pri ckeditore (html wysiwzg editor)?
Tam musim nechat html tagy, cize stripinput vypnem (ako radis) a tym padom je vsetko po starom...
ale ako potom docielim, aby to fungovalo aj pri ckeditore (html wysiwzg editor)?
Tam musim nechat html tagy, cize stripinput vypnem (ako radis) a tym padom je vsetko po starom...
-
*****HERO*****
Guru wannabe
- Príspevky: 2446
- Registrovaný: 08 máj 2006, 1:34
Re: vlastne CMS - ukladanie znaku &
tak ze by si tie tagy z toho pola vybral?
ale to je fuk, tu skaredu funkciu by som vobec nepouzival, tebe to proste staci na vystupe prebehnut cez:
ale zas si treba dat pozor, ak uz nejake vyencodovane special znaky v kode mas (napr v nejakej URL ako hodnota parametru) - tie ti replacne este raz a budes mat napr. &
cize aby si bol 100% zahojeny od amperstandov a mohol v klude spat, riesil by som to asi nejak takto
ak pouzivas UTF-8 alebo barjaky iny unicode, lomitka a tie ostatne bullshity vobec nemusis encodovat.
uvodzovky mozu robit problem max ako hodnota nejakeho atributu a to treba zabezpecit urcite inak ako obycajnym str_replace - ved ten ti dodrbe aj tie uvodzovky, ktore maju zostat. to uz by si mohol nejak poriesit ten wysiwyg editor a do DB ulozit uz encodovane.
Kód: Vybrať všetko
$search = array("&", "\"", "'", "\\", '\"', "\'", " ");
$replace = array("&", """, "'", "\", """, "'", " ");
Kód: Vybrať všetko
$str = str_replace('&', '&', $str)
cize aby si bol 100% zahojeny od amperstandov a mohol v klude spat, riesil by som to asi nejak takto
Kód: Vybrať všetko
$str = preg_replace('/&(?!([a-z]+?|#[0-9]+?);)/', '&', $str);
uvodzovky mozu robit problem max ako hodnota nejakeho atributu a to treba zabezpecit urcite inak ako obycajnym str_replace - ved ten ti dodrbe aj tie uvodzovky, ktore maju zostat. to uz by si mohol nejak poriesit ten wysiwyg editor a do DB ulozit uz encodovane.
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
To by mal urcite riesit WYSIWYG editor. Cize do DB to ukladas tak ako ti to posle WYSIWYG a tak isto to aj zobrazujes na stranke. Len treba donutit ten editor nech ti & automaticky konvertuje na &. Neviem cito nerobi CKEditor automaticky ale ak nie urcite sa to da niekde nastavit.
Re: vlastne CMS - ukladanie znaku &
a pri inputoch BEZ editora? proste jednoduche formularove inputyjorg22 napísal:To by mal urcite riesit WYSIWYG editor. Cize do DB to ukladas tak ako ti to posle WYSIWYG a tak isto to aj zobrazujes na stranke. Len treba donutit ten editor nech ti & automaticky konvertuje na &. Neviem cito nerobi CKEditor automaticky ale ak nie urcite sa to da niekde nastavit.
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
Inputy bez editora by logicky nemali obsahovat HTML kod. Cize ich ulozit presne v tom tvare ako ich uzivatel zada a vypisat to s pomocou htmlentities().
Neviem ci tam pouzivas nejaky templatovaci system ale pre jednoduchost a vyssiu bezpecnost ho odporucam. Tam by sa malo toto vypisovanie riesit automaticky a vypisovanie bez escapovani pouzijes len v pripadoch ze chces vypisat HTML kod.
Neviem ci tam pouzivas nejaky templatovaci system ale pre jednoduchost a vyssiu bezpecnost ho odporucam. Tam by sa malo toto vypisovanie riesit automaticky a vypisovanie bez escapovani pouzijes len v pripadoch ze chces vypisat HTML kod.
Re: vlastne CMS - ukladanie znaku &
V ziadnom pripade by som to neriesil na strane CKEditoru, kedze cokolvek iduce od pouzivatela sa da pouzit v takom pripade na XSS alebo SQL injection. Nechces vyskusat Htmlpurifier? http://htmlpurifier.org/
-
Michaelo
Hardcore addict
- Príspevky: 6177
- Registrovaný: 16 júl 2008, 20:29
- Bydlisko: Pri PC
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
No ja osobne kod kde nema byt HTML/PHP radsej ukladam do DB uz prehnany tou funkciou co som napisal vyssie, takto viem ze nie je sanca aby tam niekto vlozil nejaky PHP kod alebo nieco aby sa mohol naburat do DB.
Nikdy by som neukladal vstup od uzivatela do DB a az pri vypisovani ho prehnal cez tu funkciu. To mi pride ako samovrazda.
No a tam kde potrebujem vkladat HTML/PHP? Taketo veci mam iba v administracii a pristup k nim ma iba admin (vacsinou len ja), takze tam to proste nechavam nedotknute.
Funguje dlhe roky bezchybne.
Samozrejme ze ked chces len prepisat & tak staci pred ulozenim do DB
a toto pri vkladani textu do editoru:
Nikdy by som neukladal vstup od uzivatela do DB a az pri vypisovani ho prehnal cez tu funkciu. To mi pride ako samovrazda.
No a tam kde potrebujem vkladat HTML/PHP? Taketo veci mam iba v administracii a pristup k nim ma iba admin (vacsinou len ja), takze tam to proste nechavam nedotknute.
Funguje dlhe roky bezchybne.
Samozrejme ze ked chces len prepisat & tak staci pred ulozenim do DB
Kód: Vybrať všetko
$text = str_replace('&', '&', $text);Kód: Vybrať všetko
$text = str_replace('&', '&', $text);Re: vlastne CMS - ukladanie znaku &
Aky prosim ta odporucas?jorg22 napísal:Neviem ci tam pouzivas nejaky templatovaci system ale pre jednoduchost a vyssiu bezpecnost ho odporucam.
Editacia stranky, kde uzivatel moze pouzit cez editor tucne, kurzivu a enterom vytvara odseky <p>.Michaelo napísal:No a tam kde potrebujem vkladat HTML/PHP?
& pravdepodobne nebude jediny znak, ktory sa v nezmenenom stave nepaci validatorovi, cize treba najst univerzalnejsie riesenie, nezalozene iba na &Michaelo napísal:Samozrejme ze ked chces len prepisat & tak staci pred ulozenim do DB
Dakujem, toto vyzera velmi schopne, prestudujem si to.Numline1 napísal:V ziadnom pripade by som to neriesil na strane CKEditoru, kedze cokolvek iduce od pouzivatela sa da pouzit v takom pripade na XSS alebo SQL injection. Nechces vyskusat Htmlpurifier? http://htmlpurifier.org/
Re: vlastne CMS - ukladanie znaku &
Rozumiem, ale v principe je lepsie pri user inputoch pouzivat whitelisting, ako blacklisting alebo konkretne konverzie stylu htmlentities. Nie som sice bezpecnostny expert, ale tvoja funkcia tiez urcite nie je uplne nepriestrelna, kedze sa zameriava iba na konkretne znaky.Michaelo napísal:No ja osobne kod kde nema byt HTML/PHP radsej ukladam do DB uz prehnany tou funkciou co som napisal vyssie, takto viem ze nie je sanca aby tam niekto vlozil nejaky PHP kod alebo nieco aby sa mohol naburat do DB.
Nikdy by som neukladal vstup od uzivatela do DB a az pri vypisovani ho prehnal cez tu funkciu. To mi pride ako samovrazda.
No a tam kde potrebujem vkladat HTML/PHP? Taketo veci mam iba v administracii a pristup k nim ma iba admin (vacsinou len ja), takze tam to proste nechavam nedotknute.
Funguje dlhe roky bezchybne.
Samozrejme ze ked chces len prepisat & tak staci pred ulozenim do DB
a toto pri vkladani textu do editoru:Kód: Vybrať všetko
$text = str_replace('&', '&', $text);Kód: Vybrať všetko
$text = str_replace('&', '&', $text);
-
Michaelo
Hardcore addict
- Príspevky: 6177
- Registrovaný: 16 júl 2008, 20:29
- Bydlisko: Pri PC
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
Nehovorim ze je nepriestrelna, ale ta moja funkcia toho robi trosku viac ako htmlentities, ale su si velmi podobne. A povedal by som ze prave najdolezitejsie znaky u HTML su uvodzovky a lomene zatvorky. Znemozni ich pouzitie a HTML ti do kodu proste nedaju. Kedze mne je uplne sumak co tam blozis, ale nechcem aby si tam vkladal " ' < > & \ a tvrdu medzeu ktoru trim neodstrani.
Uz som videl kde vobec nerobili takuto validaciu na jednej stranke a mohol som na ten web vlozit moj vlastny javascript... Ak je clovek sikovny a dokaze vyuzit bugy v samotnej Jave, tak moze dokonca ziskat aj hesla co maju ludia ulozene v chrome...
Uz som videl kde vobec nerobili takuto validaciu na jednej stranke a mohol som na ten web vlozit moj vlastny javascript... Ak je clovek sikovny a dokaze vyuzit bugy v samotnej Jave, tak moze dokonca ziskat aj hesla co maju ludia ulozene v chrome...
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
Boccaccio: Mne sa najlepsie robi s Latte ale je to sucastou Nette a neviem ako zlozito to pojde pouzivat oddelene. Inac to ma dost podobnu syntax ako Smarty. No ten ma o nieco zlozitejsiu syntax.
Ked som hovoril ze o to by sa mal starat WYSIVYG editor tak som pocital s tym ze to chces do administracie, cize by mal k tomu pristup len admin, to znamena ze nema v umysle skodit uzivatelom.
Ak to chces pre uzivatelov, tak urcite pri vkladani do DB pouzi strip_tags(). Povol iba niektore fukcie, napriklad tucne pismo, zmenu farby, ....
Tak ako to je spravene napriklad tu na fore cize napr pre tucne pismo pouzijes znacku, ktoru ti htmlentities a strip_tags neodfiltruju.
Potom az pri vypisovani pouzi htmlentities() a nahrad ich prislusnym HTML tagom.
Mozes to nahradzat aj pri vkladani do DB ale pri pripadnych zmenach tagov to bude jednoduchsie.
Ked som hovoril ze o to by sa mal starat WYSIVYG editor tak som pocital s tym ze to chces do administracie, cize by mal k tomu pristup len admin, to znamena ze nema v umysle skodit uzivatelom.
Ak to chces pre uzivatelov, tak urcite pri vkladani do DB pouzi strip_tags(). Povol iba niektore fukcie, napriklad tucne pismo, zmenu farby, ....
Tak ako to je spravene napriklad tu na fore cize napr pre tucne pismo pouzijes znacku, ktoru ti htmlentities a strip_tags neodfiltruju.
Kód: Vybrať všetko
[b][/b]Mozes to nahradzat aj pri vkladani do DB ale pri pripadnych zmenach tagov to bude jednoduchsie.
-
Michaelo
Hardcore addict
- Príspevky: 6177
- Registrovaný: 16 júl 2008, 20:29
- Bydlisko: Pri PC
- Kontaktovať používateľa:
Re: vlastne CMS - ukladanie znaku &
Tak tak, ak to chces pre pouzivatelov tak BB code je idealne riesenie, rozhodne nepovoluj ludom pisat HTML do vstupnych poli bez nejakej upravy pred vlozenim.
Ak realne chces len to &, tak na to si tu uz kod dostal.
Toto je kod co pouzivam ja:
Da sa to spravit aj krajsie, no kedze ja chcem len par zakladnych BB tagov, tak som si to spravil takto.
Ak realne chces len to &, tak na to si tu uz kod dostal.
Toto je kod co pouzivam ja:
Kód: Vybrať všetko
function parse_bb($text){
$text = preg_replace('#\[b\](.*?)\[/b\]#si', '<strong>\1</strong>', $text);
$text = preg_replace('#\[i\](.*?)\[/i\]#si', '<em>\1</em>', $text);
$text = preg_replace('#\[u\](.*?)\[/u\]#si', '<span style="text-decoration: underline;">\1</span>', $text);
$text = preg_replace('#\[t\](.*?)\[/t\]#si', '<span style="text-decoration: line-through;">\1</span>', $text);
$text = preg_replace('#\[o\](.*?)\[/o\]#si', '<span style="text-decoration: overline;">\1</span>', $text);
return $text;
}