Как безопасно разбирать bbcode?

Я пытаюсь разобрать BBcodes в php, но я не думаю, что мой код вообще безопасен.

$Text = preg_replace("(\[color=(.+?)\](.+?)\[\/color\])is","<span style=\"color: $1\">$2</span>",$Text); 

Я думаю, что вы можете сделать инъекцию следующим образом, и это сработает:

[color=<script>alert('gotcha');</script>]...[/color]

Как улучшить мое регулярное выражение, чтобы захватить только два стандартных цветовых формата:

[color=red]...[/color] OR [color=#FF0000]...[/color]

Спасибо


person Emily    schedule 18.04.2010    source источник
comment
Чтобы замаскировать html-теги, все, что вам нужно, это заменить все < на &lt;   -  person serg    schedule 18.04.2010
comment
BBCode не является обычным языком, поэтому для его разбора нельзя использовать регулярное выражение.   -  person Gumbo    schedule 18.04.2010


Ответы (3)


На самом деле PHP имеет встроенную поддержку bbcode (хотя вам нужно установить расширение PECL).

Кроме того, вы можете использовать библиотеку PEAR HTML_BBCodeParser.

Я бы рекомендовал использовать одно из приведенных выше решений вместо написания собственного, поскольку они были протестированы сообществом.

person jimyi    schedule 18.04.2010

(\[color=((([a-zA-Z])+)|(\#[A-F0-9]{1,6})))

Я думаю, что это идея, мое регулярное выражение немного ржавое (извините).

person ssube    schedule 18.04.2010

Если вы хотите написать свой собственный анализатор bbcode, лучше потратить некоторое время на написание приличного Рекурсивный синтаксический анализатор для него.

Это потому, что вы должны быть уверены, что bbcode правильно отформатирован и вложен, наличие случайного кода в вашем коде может нарушить макет. Вы должны позаботиться об удалении любых идентификаторов протокола javascript:// в ссылках. И возьмите, чтобы пройтись по строке только один раз, чтобы избежать двойного кодирования ([b[b]выделено мной[/b]]я тоже[/b]). Список можно продолжать, и он выходит за рамки простых регулярных выражений, чтобы все было правильно.

person Marijn van Vliet    schedule 18.04.2010