[PHP] "veilige" BB codes werken niet zoals het moet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb gister BB code gemaakt voor me forum, maar ik heb een klein probleempje. Ik heb al 1.5 uur gezocht in me code, en ook bijna 1.5 uur op het internet. Maar ik kan het maar niet verhelpen.

Het gaat om de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Function BB($string)
{
    $string=addslashes($string);
    $string=str_replace(array('javascript','"'),array('java script','''), $string);
    $string=preg_replace('/\\[b\](.*?)\\[\/b\]/is','<b>\1</b>',$string);
    $string=preg_replace('/\\[u\](.*?)\\[\/u\]/is','<u>\1</u>',$string);
    $string=preg_replace('/\\[i\](.*?)\\[\/i\]/is','<i>\1</i>',$string);
    $string=preg_replace('/\\[url\](.*?)\\[\/url\]/is','<a href="\1" target=_blank>\1</a>',$string);
    $string=preg_replace('/\[url=(.*?)\](.*?)\\[\/url\]/is','<a href="\1" target=_blank>\2</a>',$string);
    $string=preg_replace('/\\[img\](.*?)\\[\/img\]/is','[img]"\1"[/img]',$string);
    return $string;
}


Ik had gelezen dat je de URL tag veilig moet maken voor javascript, en daarvoor moest je onderandere addslashes er overheen gooien. Dat heb ik dus gedaan.
Maar nu krijg ik wel een slash voor elke ' en /. Hierdoor werken sommige smileys niet, en het staat niet echt zo netjes :+.

Wie o wie kan dit noepje helpen? :(

Acties:
  • 0 Henk 'm!

Verwijderd

Maar wat is nu het probleem?

Zoals je het zelf aangeeft gebruik je addslashes... tot zover goed.
Maar de smiley's doen het niet.
Vergeet je dan niet gewoon bij de weergave stripslashes te doen?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik wel stripslashes. Maar als ik die ook ga gebruiken bij me BB code is het niet meer veilig.
Dit is de zin waar het gebruikt wordt:

$post=Smiley(BB(stripslashes(nl2br(htmlentities($post_record['post'])))));

Het probreem nu is dat sommige smiles niet werken omdat ik een \ voor de ' krijg. :'( werkt bijvoorbeeld dus niet. Ik kan de str_replace wel gaan aanpassen naar :\'( maar het ziet er ook niet echt netjes uit in een post.

[ Voor 36% gewijzigd door Verwijderd op 02-03-2006 16:27 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

het addslashes verhaal is onzin; ik kan prima javascript schrijven zonder quotes te gebruiken.
Wat je moet doen is checken of de URL wel begint met een valide 'veilig' protocol (bijvoorbeeld http://, https:// ftp:// etcetera) - zo niet dan niet omzetten of er zelf http:// voor zetten. Dat geldt uiteraard ook voor je img-tag
Verder dienen alle speciale HTML karakters HTML-encoded te worden, zowel in content als in attributen.

[ Voor 8% gewijzigd door crisp op 02-03-2006 16:31 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Aha bedankt!
Dus zo is me url tag goed?
code:
1
2
$string=preg_replace('/\\[url\]http:\/\/(.*?)\\[\/url\]/is','<a href=http://"\1" target=_blank>\1</a>',$string);
    $string=preg_replace('/\[url=http:\/\/(.*?)\](.*?)\\[\/url\]/is','<a href="http://\1" target=_blank>\2</a>',$string);

[ Voor 20% gewijzigd door Verwijderd op 02-03-2006 16:36 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Ik zou eerder zoiets doen:
PHP:
1
2
3
4
5
6
7
8
9
10
$string = preg_replace_callback('/\\[url(=(.+?))?\](.+?)\\[\/url\]/i', 'tag_url', $string);

function tag_url($matches)
{
    $url = $matches[2] ? $matches[2] : $matches[3];
    if (!preg_match('/^https?:\/\/|ftp:\/\/|irc:\/\/|mailto:/i', $url))
        $url = 'http://' . $url;

    return '<a href="' . htmlspecialchars($url) . '" target="_blank">' . htmlspecialchars($matches[3]) . '</a>';
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Aha bedankt ^_^
Nog een klein vraagje...
Kan je alsjeblieft deze zin uitleggen?
$url = $matches[2] ? $matches[2] : $matches[3];
Deze snap ik niet :P

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Verwijderd schreef op donderdag 02 maart 2006 @ 16:54:
Aha bedankt ^_^
Nog een klein vraagje...
Kan je alsjeblieft deze zin uitleggen?
$url = $matches[2] ? $matches[2] : $matches[3];
Deze snap ik niet :P
Dat heet een ternary operator en is eigenlijk een verkorte if-else:
PHP:
1
2
3
4
5
6
7
8
if ($matches[2])
{
  $url = $matches[2];
}
else
{
  $url = $matches[3];
}


Ik gebruik overigens htmlspecialchars in mijn voorbeeld, maar het ligt een beetje aan de rest van je code of je dat daar wel nodig hebt, maar dat mag je zelf uitvogelen :P
Je ziet hier in ieder geval dat door het gebruik van een callback-functie je veel meer (en duidelijker) logica kan toevoegen.

[ Voor 10% gewijzigd door crisp op 02-03-2006 17:00 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Mr. Bondt
  • Registratie: Februari 2005
  • Laatst online: 27-08 14:50
Verwijderd schreef op donderdag 02 maart 2006 @ 16:54:
Kan je alsjeblieft deze zin uitleggen?
$url = $matches[2] ? $matches[2] : $matches[3];
Verkorte versie van het if-else-statement:
PHP:
1
2
3
4
5
6
if ($matches[2]) {
  $url = $matches[2];
}
else {
  $url = $matches[3];
}


edit:
Spuit 11 :P

[ Voor 14% gewijzigd door Mr. Bondt op 02-03-2006 16:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Aha ik snap hem!
Iedereen hardstikke bedankt! :)


EDIT:
<schaampte>
De laatste vraag.. Hoe pas ik deze function toe? Als ik hem in de BB function zet krijg ik een error.
</schaampte>

[ Voor 59% gewijzigd door Verwijderd op 02-03-2006 17:06 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Die functie kan je gewoon onder je BB functie zetten.
Vergeet niet ook iets soortgelijks voor je img-tag te doen

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wouw dit werkt mooi! :D

Echt heel erg bedankt!
Pagina: 1