vlastne CMS - ukladanie znaku &

Programovacie jazyky, rady, poradňa...
Boccaccio
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1097
Registrovaný: 01 mar 2014, 14:00
Bydlisko: Bratislava

vlastne CMS - ukladanie znaku &

Príspevok od používateľa Boccaccio »

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.
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Michaelo »

Ja pouzivam toto:

Kód: Vybrať všetko

function stripinput($text) {
	if (!is_array($text)) {
		$text = preg_replace("/(&)+(?=\#([0-9]{2,3});)/i", "&", $text);
		$search = array("&", "\"", "'", "\\", '\"', "\'", "<", ">", "&nbsp;");
		$replace = array("&", """, "'", "&#92;", """, "'", "<", ">", " ");
		$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']);
Funguje dokonale.

Tam kde v Backende musis zachovat samotne znaky proste nepouzijes stripinput na vstup.
Boccaccio
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1097
Registrovaný: 01 mar 2014, 14:00
Bydlisko: Bratislava

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Boccaccio »

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...
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa *****HERO***** »

tak ze by si tie tagy z toho pola vybral? :roll:

Kód: Vybrať všetko

$search = array("&", "\"", "'", "\\", '\"', "\'", "&nbsp;");
$replace = array("&", """, "'", "&#92;", """, "'", " ");
ale to je fuk, tu skaredu funkciu by som vobec nepouzival, tebe to proste staci na vystupe prebehnut cez:

Kód: Vybrať všetko

$str = str_replace('&', '&', $str)
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. &amp;

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);
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.
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa jorg22 »

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.
Boccaccio
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1097
Registrovaný: 01 mar 2014, 14:00
Bydlisko: Bratislava

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Boccaccio »

jorg22 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.
a pri inputoch BEZ editora? proste jednoduche formularove inputy
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa jorg22 »

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.
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Numline1 »

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
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Michaelo »

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

Kód: Vybrať všetko

$text = str_replace('&', '&', $text);
a toto pri vkladani textu do editoru:

Kód: Vybrať všetko

$text = str_replace('&', '&', $text);
Boccaccio
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1097
Registrovaný: 01 mar 2014, 14:00
Bydlisko: Bratislava

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Boccaccio »

jorg22 napísal:Neviem ci tam pouzivas nejaky templatovaci system ale pre jednoduchost a vyssiu bezpecnost ho odporucam.
Aky prosim ta odporucas?
Michaelo napísal:No a tam kde potrebujem vkladat HTML/PHP?
Editacia stranky, kde uzivatel moze pouzit cez editor tucne, kurzivu a enterom vytvara odseky <p>.
Michaelo napísal:Samozrejme ze ked chces len prepisat & tak staci pred ulozenim do DB
& pravdepodobne nebude jediny znak, ktory sa v nezmenenom stave nepaci validatorovi, cize treba najst univerzalnejsie riesenie, nezalozene iba na &
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/
Dakujem, toto vyzera velmi schopne, prestudujem si to.
Numline1
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 858
Registrovaný: 04 dec 2006, 18:04

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Numline1 »

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

Kód: Vybrať všetko

$text = str_replace('&', '&', $text);
a toto pri vkladani textu do editoru:

Kód: Vybrať všetko

$text = str_replace('&', '&', $text);
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
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Michaelo »

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...
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa jorg22 »

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.

Kód: Vybrať všetko

[b][/b]
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.
Michaelo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6177
Registrovaný: 16 júl 2008, 20:29
Bydlisko: Pri PC
Kontaktovať používateľa:

Re: vlastne CMS - ukladanie znaku &

Príspevok od používateľa Michaelo »

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:

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;
}
Da sa to spravit aj krajsie, no kedze ja chcem len par zakladnych BB tagov, tak som si to spravil takto.
Napísať odpoveď