Войти
Люди
Помощь
Donald Trump

Как фильтровать bbcode

Если у вас блог (как у меня) или просто какой-либо статейник, то вы наверное уже сталкивались с тем, что вам необходимо было сделать например, жирный шрифт или курсивный шрифт и тд. И вот, вы на радостях сделали BBCode и пришла пора добавлять BBCode img. Уверен, он у вас 100% должен быть, так как вам же необходимо будет вставлять картинки в статьи. Но, самое интересное то, что например в тег img можно встраивать всякие “какашки”, даже не в один тег img, но и в несколько других тегов тоже можно вставлять. Если вы один пишете статьи, то это ладно, но если статьи писать могут многие, то стоит обезопасить себя например от XSS. И как же это будет выглядеть:
  1. <img src="/riblog/javascript:alert()" onerror='javascrip:alert().jpg' ">

И что мы получаем? Конечно-же выполнение js. Давайте-ка провернем со стандартным BBCode img.
  1. <a href="/riblog/javascript:alert()" title="просмотр изображения"><img alt="Изображение" role="image" aria-label="Изображение image riblog" title="Изображение с сайта riblog.ru" src="/riblog/javascript:alert()" style="width:100%;"></a>

У всех конструкция разная, но уверен, что принцип один одинаковый. Хочу предупредить, что функция htmlspecialchars() и add_slash() частично спасут вас от такого казуса, но я всегда предпочитаю подстраховываться.
И вот настал волнительный момент, как же нам обработать такие теги и как же обезопасить себя от такой штуки?
Для этого мы воспользуемся добавленной в php 5.6 уже готовой функцией bbcode_create. Её не нужно устанавливать дополнительно и настраивать, она уже включена в комплект. Суть у неё в том, что бы возвращать новый ресурс BBCode, используемый для разбора строк с BBCode. Наверное вы не чего не поняли. В общем, должно получатся как-то так:
  1. <?php
  2. $arrayBBCode=[
  3. 'i'=> ['type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<i>', 'close_tag'=>'</i>', 'childs'=>'b'];
  4. ?>

Это простейшая фильтрация тега <b>
Тут все понятно:
open_tag – открывающий тег
close_tag – закрывающий тег
childs – все разрешенные теги в нем

Работа bbcode_create


Работает она тоже не сложно. Вот что говорит нам php.net о ней:
Изображение
И как же нам профильтровать тег img? – спросите вы. А все просто, для этого мы составим небольшую функцию.
  1. <?php
  2. // На будущее, что бы проверить
  3. $text ='[img]http://riblog.ru/php.gif[/img]';
  4. // Сама функция проверки тега
  5. $arrayBBCode=[
  6. 'img'=> ['type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<img src="', 'close_tag'=>'" />', 'childs'=>''
  7. ];
  8. // Выводим
  9. $BBHandler=bbcode_create($arrayBBCode);
  10. echo bbcode_parse($BBHandler,$text);
  11. ?>

bbcode_parse - разбирает и возвращает все правила созданные функцией bbcode_create.
chields я оставил пустым, что бы внутри не сунули не какие теги. А то бывают всякие умники.
И что же мы получаем в итоге? А вот что:
  1. [img]http://static.php.net/www.php.net/images/php.gif[/img]

Мы получаем уже отфильтрованную стандартными методами функцию, которая не позволит вставить в ваши теги не какой дичи и не нужного говна. Хочу вам подметить, что это только с тегом img я так провернул, с остальными тегами (в которых что-то вставляется и выводится) можно сделать так же. Дальше как захотите, так и используйте её.