Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: BBCode

Sivun loppuun

Tomppa32 [18.11.2009 15:55:30]

#

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);
?>

Juhko [02.01.2010 03:46:30]

#

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.

Teuro [04.01.2010 19:04:37]

#

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]");
?>

Tomppa32 [05.01.2010 14:36:50]

#

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;
}
?>

rautamiekka [18.01.2010 19:08:59]

#

Kertoisitteko tietämättömälle mikä idea on tekstipötkössä

'/\[b\](.*?)\[\/b\]/is'

? Ei mitään logiikkaa.

trilog [18.01.2010 20:42:29]

#

https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=phpsl

Le-Co-Las [03.03.2010 06:14:29]

#

kiitos Tomppa32, tätä kokeilen mielenkiinnolla.!!!!

Petja [28.12.2010 13:42:55]

#

Aivan mahtava.

Petja [28.12.2010 13:43:03]

#

Aivan mahtava.

ErroR++ [04.07.2011 18:10:03]

#

Hyvä on.

Metabolix [14.12.2011 20:51:05]

#

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.

Tomppa32 [16.12.2011 23:10:25]

#

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

Metabolix [18.12.2011 21:11:45]

#

No eikö se olisi helpompi korjata yksillä lainausmerkeillä, kuten ehdotin?

Tomppa32 [20.03.2012 13:58:53]

#

Katos, empäs huomannutkaan että olivat päässeet unohtumaan tuosta yhdestä kohdasta. =)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta