Yksinkertainen, helposti toimiva BBCode vieraskirjoihin sekä muihin tekstin muokkaus ominaisuutta tarvitseviin paikkoihin.
Koodissa on listattu BBCode-koodit sekä niitä vastaavat HTML-koodit. Funktio etsii viestistä BBCode merkinnät ja vaihtaa ne HTML koodiin.
Näin käyttäjä ei voi itse suoraan levittää sivulle haitallista HTML-koodia.
Kyseinen funktio on käytössä myös omassa vieraskirjassani.
http://koti.mbnet.fi/tompz/!testivieraskirja
BBCode funktio
<?php ############ BBCode - v1.0 ############ ########### by: NDev / Tompz ########## ######## http://ndev.viuhka.fi/ ####### ####################################### # Saa levittää ja muokata vapaasti # ####################################### function BBCode($teksti){ // Poistetaan ylimääräiset merkit // Poistetaan ylimääräiset kenoviivat (\) // Estetään HTML-koodin käyttö $teksti = trim(stripslashes(htmlentities($teksti))); // Muutetaan rivinvaihdot HTML-muotoon $teksti = nl2br($teksti, false); $code_search = array( // Etsittävät BBCode merkinnät '/\[b\](.*?)\[\/b\]/is', '/\[i\](.*?)\[\/i\]/is', '/\[u\](.*?)\[\/u\]/is', '/\[tt\](.*?)\[\/tt\]/is', '/\[img\](.*?)\[\/img\]/is', '/\[img\=(.*?)\]/is', '/\[url\](.*?)\[\/url\]/is', '/\[url\=(.*?)\](.*?)\[\/url\]/is', '/\[size\=(.*?)\](.*?)\[\/size\]/is', '/\[color\=(.*?)\](.*?)\[\/color\]/is', '/\[quote\](.*?)\[\/quote\]/is', '/\[quote\=(.*?)\](.*?)\[\/quote\]/is', '/\[left\](.*?)\[\/left\]/is', '/\[right\](.*?)\[\/right\]/is', '/\[center\](.*?)\[\/center\]/is'//, //'/\[ \](.*?)\[\/ \]/is', ); $code_replace = array( // BBCode merkinnät korvataan näillä '<strong>$1</strong>', '<em>$1</em>', '<u>$1</u>', '<tt>$1</tt>', '<img src="$1">', '<img src="$1">', '<a href="$1" target="_blank">$1</a>', '<a href="$1" target="_blank">$2</a>', '<font size="$1">$2</font>', '<font color="$1">$2</font>', 'Lainaus:<blockquote><p>$1</p></blockquote>', 'Lainaus käyttäjältä $1:<blockquote><p>$2</p></blockquote>', '<div align="left">$1</div>', '<div align="right">$1</div>', '<div align="center">$1</div>'//, //'', ); // Tehdään hommat $teksti = preg_replace ($code_search, $code_replace, $teksti); // Palautetaan valmis teksti return $teksti; } ?>
Käyttöesimerkki
<?php $viesti = "[size=4][b]BBCode[/b][/size] [size=4][i][color=green]t[/color]". "[color=darkred]o[/color][color=darkblue]i[/color][color=brown]m[/color]". "[color=green]i[/color][color=indigo]i[/color]![/i][/size]\n<br>". "<b>HTML</b> <font color=\"red\"><i>toimii!</i></font>"; echo "Ilman BBCodea:<br>\n".$viesti; echo "<br><br>\n"; echo "BBCodella:<br>\n".BBCode($viesti); ?>
Ihan hyvä vinkki. Sen verran vain kommenttina, että font-tagin sijaan tulisi käyttää span:ia ja määritellä tyylit CSS:llä. Lisäksi tuota voisi kehittää eteenpäin vaikkapa tekemällä tagien automaattisen sulkemisen.
Etsintä ja korvaus kannattaa pitää samassa taulukossa.
<?php $korvaus = Array(); $korvaus["/\\[b\\](.*?)\\[\\/b\\]/"] = "<b>$1</b>"; echo preg_replace(array_keys($korvaus), array_values($korvaus), "[b]Moikka[/b]"); ?>
BBCode funktio hieman lyhemmin, koodi tulkitaan eri tavalla sekä ominaisuuksia on hieman vähemmän.
<?php function BBcode ($data) { $data = trim(stripslashes(htmlentities($data))); $data = nl2br($data, false); $data = preg_replace("/\[(\/?)(b|u|i|s|strike|blockquote|code|pre)\]/is", "<$1$2>", $data); $data = preg_replace("/\[url\](.*?)\[\/url\]/is", "<a href=\"$1\" target=\"_blank\">$1</a>", $data); $data = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is", "<a href=\"$1\" target=\"_blank\">$2</a>", $data); return $data; } ?>
Kertoisitteko tietämättömälle mikä idea on tekstipötkössä
'/\[b\](.*?)\[\/b\]/is'
? Ei mitään logiikkaa.
kiitos Tomppa32, tätä kokeilen mielenkiinnolla.!!!!
Aivan mahtava.
Aivan mahtava.
Hyvä on.
Tällaisten koodien ongelmahan on tyypillisesti (ja myös tässä tapauksessa), että epävalidi syöte aiheuttaa epävalidia HTML:ää sivulle, esim. <b>X<i>Y</b>Z</i>.
Lisäksi ainakin size-tagissa on XSS-aukko, parametrin ympärille pitäisi ehdottomasti laittaa lainausmerkit. Nyt voi kirjoittaa vaikka näin:
[size=1 style=display:block;position:fixed;left:0;top:0;width:100%;height:100%; onmousemove=location=this.title title=https://www.ohjelmointiputka.net/]HAX[/size]
Tuloksena on koko sivun täyttävä font-tagi, joka ohjaa käyttäjän Ohjelmointiputkan etusivulle heti, kun hiiri liikkuu.
Metabolix kirjoitti:
Lisäksi ainakin size-tagissa on XSS-aukko, parametrin ympärille pitäisi ehdottomasti laittaa lainausmerkit. Nyt voi kirjoittaa vaikka näin:
[size=1 style=display:block;position:fixed;left:0;top:0;width:100%;height:100%; onmousemove=location=this.title title=https://www.ohjelmointiputka.net/]HAX[/size]
Tällä ongelman pitäisi saada korjattua:
<?php function secure_html($teksti){ //poistetaan.. $searchs = array('@<script[^>]*?>.*?</script>@si', //..script tagit sisältöineen '@<style[^>]*?>.*?</style>@siU', //..sama juttu style ja tageille '@<![\s\S]*?--[ \t\n\r]*>@', //..myös kommentit pois häiritsemästä ); //tehdään hommat $teksti = preg_replace($searchs, '', $teksti); //poistetaan tagi, jos attribuuttina on-alkuinen (esim. onclick, onload jne.) $teksti = preg_replace('#\s*<(/?\w+)\s*([^>]*)\s*(?:on\w+\s*=\s*["\'\s]?.+?["\'\s]?|style=["\'].+?["\'])\s*>#is', '<${1}>', $teksti); //poistetaan linkit, jotka sisältävät javascriptiä esim. <a href="javascript:href=javascript:alert('asd')>linkki</a> $teksti = preg_replace('#\s*<(/?\w+)\s*([^>]*?)\s*(href\s*=["\'\s]?\s*javascript\s*:.*?["\'\s]?)\s*([^>]*?)>#is', '<${1} ${2}>', $teksti); return $teksti; } ?>
Kyseinen funktio suoritetaan BBCodeksi muuttamisen jälkeen.
$text = "[size=1 style=display:block;position:fixed;left:0;top:0;width:100%;height:100%; ". "onmousemove=location=this.title title=https://www.ohjelmointiputka.net/]HAX[/size]"; echo secure_html(BBCode($text)); //output: HAX
No eikö se olisi helpompi korjata yksillä lainausmerkeillä, kuten ehdotin?
Katos, empäs huomannutkaan että olivat päässeet unohtumaan tuosta yhdestä kohdasta. =)
Aihe on jo aika vanha, joten et voi enää vastata siihen.