HtmlCleaner - PHP класс, предназначенный для удаления лишних тегов и атрибутов.

HtmlCleaner - PHP класс, предназначенный для удаления лишних тегов и атрибутов.

В современном Интернете сайты часто разрешают пользователям размещать различный контент на сайте. Контент может быть совершенно различным: новости, блоги, статьи, комментарии.

Пользовательский контент очень важен для сайта. Как правило, такой контент размещается добросовестными пользователями, которые действительно хотят разместить информацию. В чем же подвох?

Во-первых, большинство пользователей, которые просматривают сайт, не имеют представления о том, что такое html или, имея такое представление, пытаются "украсить" свой материал, нарушая при этом визуальное оформление и дизайн сайта.

Естественно вам такая самодеятельность совершенно не нужна. Поэтому можно просто использовать bb-коды или удалить все ненужные теги функцией strip_tags из введенных пользователем данных. Мера жесткая, но эффективная.

Однако, на самом деле не все так радужно. Я не сторонник использования bb-кодов. Кроме того, мне нравится предоставлять пользователю возможность работы с wysiwyg редактором. Поэтому мне очень удобно принимать у пользователей текст в виде html.

Естественно, введенный текст я обрабатываю функцией strip_tags, оставляя нужные теги. Но при этом все равно остается возможность добавления несанкционированного контента.

Есть люди, которые, размещая материалы на вашем сайте, преследуют свои личные цели. И контент, размещенный ими, может принести вред не только вашему сайту, но и пользователям, которые его просматривают даже в этом случае.

Все дело в том, что функция strip_tags удаляет лишние теги, а все остальные теги остаются с пользовательским атрибутами. В чем проблема? Как уже было сказано, меняя значения атрибутов, пользователь может изменить оформление текста. Но это пол беды. Такие изменения довольно безобидны. Но наряду с атрибутами class и style есть много атрибутов, позволяющих внедрить на страницу JavaScript код - onclick, onload, onmousemove, onmouseover, ondrag. Этот список можно долго продолжать. Кроме того, JavaScript код можно разместить в атрибуте href тега а - ссылки. При этом вы уже не можете контролировать то, что выполнить этот код при просмотре страницы пользователем. Такой JavaScript код может наделать много бед. Именно поэтому каждый сайт должен защитить себя и других пользователей от такого вредоносного контента.

Поэтому возникает задача контроля атрибутов тегов введенных пользователем. Меня вполне устраивает ситуация, когда все ненужные атрибуты будут просто удалены. Кроме того, для меня важна гибкость и простота настройки поведения класса, т.е. я не хочу каждый раз писать регулярное выражение, чтобы оставить поддержку нового атрибута у тега и т.д. Именно для решения последней задачи и был написан класс, указанный в заголовке

Какие требования предъявлялись к классу HtmlCleaner до его написания?

  • работает по принципу "что не разрешено, то запрещено";
  • класс поддерживает гибкую настройку. Разрешенные теги и атрибуты указываются в виде строки вида "p[class|style],h1,h2,h3,a[href]";
  • позволяет удалить ссылки с JavaScript.

Что не требовалось, но могло бы быть реализовано:

  • класс не контролирует значения атрибутов, нельзя указать разрешенные значения атрибутов или регулярное выражение;
  • к скорости работы и отнимаемым ресурсам требования не предъявлялись.

Итак, сформулировав поставленную задачу, был написан класс HtmlCleaner.

Конструктор класса принимает два параметра $allowed_tags и $allow_href_js:

Первый параметр позволяет указать, какие теги и атрибуты следует оставить (см. пример выше). Второй представляет собой булево значение, разрешающее или запрещающее JavaScript в атрибуте href.

После инициализации объекта, можно обрабатывать html. Очистка производится линь одним методом clean(). Данный метод работает в 2 этапа: первый - удаление ненужных тегов функцией strip_tags, второй - удаление не разрешенных атрибутов.

Пример использования:

Скачать класс описанный выше можно на моем сайте на этой страничке: HtmlCleaner.

Буду рад услышать от пользователей конструктивную критику.

Комментарии (8)
  • Alex Воскресенье 18 Май 2014
    Спасибо, класс нужный! Правда есть одна проблемка - если указать в $allowed_tags = a[с|атрибутами], но не указать img[с|атрибутами], и html будет примерно таким: , то на выходе получим незакрытый тег ссылки:
  • Alex Воскресенье 18 Май 2014
    в предыдущем сообщении вырезалисть теги. html такой: -a href="3143.html"--img src="dfgdfg.png" / --a/- после обработки незакрытый тег ссылки-a href="3143.html"-
  • Alex Воскресенье 18 Май 2014
    а если заменить эту строку $result = $document->saveXML(); на эту $result = $document->saveHTML(); то все в порядке. Что значит комментарий "//saveHTML почему-то перекодирует символы..." ?
  • exmusic Вторник 20 Май 2014
    В общем, чтобы все было в порядке, заменяете эту строку: "$result = $document->saveXML();//saveHTML почему-то перекодирует символы..." На эту: "$result = $document->saveHTML();" После: "$allowed_attributes = $this->getAllowedAtributes($node->nodeName);" добавляете еще одну строку: "$allowed_attributes = array('content','http-equiv');" и все работает как надо. Дело в том, что saveHTML перекодировал кириллические символы из-за того, что при удалении тегов, удалялся и тег META, который указан в $document->loadHTML, а в этом META имеется информация о кодировке. Еще раз спасибо за класс!
  • Alex Вторник 20 Май 2014
    Еще желательно перекодировать класс в кодировку UTF-8 (без BOM)
  • admin Воскресенье 25 Май 2014

    Списибо за лестные отзывы. Сейчас сильно загружен на работе. Но в ближайшее время внесу ваши рекомендации.

  • Alex Вторник 27 Май 2014
    Попаравочка. Вот что нужно сделать: заменяете эту строку: "$result = $document->saveXML();//saveHTML почему-то перекодирует символы..." На эту: "$result = $document->saveHTML();" Заменяете эту строку: "$allowed_attributes = $this->getAllowedAtributes($node->nodeName);" На эту: "$allowed_attributes = array_merge($this->getAllowedAtributes($node->nodeName), array('content','http-equiv'));" Все работает!
  • Андрей Суббота 29 Ноябрь 2014
    Вроде как очень крутой класс, дайте скачать как то? при регистрации письма не приходят
Добавить комментарий
Вам необходимо включить показ изображений в браузере для того чтобы увидеть код

Дайте нам знать, что вы - живой человек. Для нас это важно!
Кликните, если плохо видно

Прежде чем высказать свое мнение, прочитайте пожалуйста: правила

Рейтинг@Mail.ru