Фильтрация вывода по белому списку

Часто ли Вам, как web-разработчику, приходилось переживать за то, как вывести контент, оставленный пользователем, на страницу?
Думаю многие уже вооружались strip_tags() и htmlspecialchars(), но сегодня я пошел немного дальше. Теперь нет необходимости забирать возможность выводить любые теги, теперь можно просто указать какие теги допустимы к выводу, а так же какие атрибуты они могут содержать, ведь ни для кого не секрет, что onclick или onmouseover в безобидном теге DIV может творить чудеса :)
Под катом ссылка на скачивание и пример использования.

Скачать OutputFilter.php

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


$allowed_tags = "a, b, i, u, em, strong, img, embed, br, param, div, span, object, ul, li, ol, table, tr, td";
$allowed_attrs = "src, name, value, width, height, href, type";

$filter = new OutputFilter();
$filtered_str = $filter
    ->setAllowedTags( $allowed_tags )
    ->setAllowedAttrs( $allowed_attrs )
    ->process( $dangerous_string_with_html ); // передаем "опасную" строку

echo $filtered_str; // за эту строку можно не бояться

теперь можно не бояться что в результирующей строке будет что-то кроме нужных нам тегов с “правильными” аттрибутами (да, ролики с ютюба и пр. флеш контент останется при таком наборе правил)

Для любителей “ретро” еще один класс для фильтрации вывода: InputFilter.php. Мне он не подошел по причине неправильной обработки аттрибутов и отсутствия нативной поддержки UTF8 строк (пришлось делать замену обычных функций обработки строк на их mb_* аналоги)

P.S. ВНИМАНИЕ! Для корректного использования необходима библиотека Tidy

Tags: , , ,

Также рекомендую к прочтению:

5 Responses to “Фильтрация вывода по белому списку”

  1. Chiffa Says:

    Эмм… А у есть аттрибут src?

  2. Chiffa Says:

    <br />

  3. Алексей Токарь Says:

    а какая разница? в примере показана фильтрация по белому списку тегов и по белому списку атрибутов тегов. Не важно какой из аттрибута кому принадлежит…

    Или я тебя не понял :)

  4. Alexey Says:

    http://htmlpurifier.org/

  5. Алексей Токарь Says:

    да да - возможно, только у меня не прошло по фильтрации это: “<embed>
    <param name=”test” value=123 />
    <param name=”url” value=’http://123123.com?asdasd=123&hkajsd=1234′ />

    </embed>”

Leave a Reply

Введите следующие символы: