Фильтрация вывода по белому списку
Часто ли Вам, как 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
Также рекомендую к прочтению:
Сентябрь 3rd, 2008 at 15:57
Эмм… А у есть аттрибут src?
Сентябрь 3rd, 2008 at 15:57
<br />
Сентябрь 3rd, 2008 at 15:58
а какая разница? в примере показана фильтрация по белому списку тегов и по белому списку атрибутов тегов. Не важно какой из аттрибута кому принадлежит…
Или я тебя не понял
Сентябрь 4th, 2008 at 08:45
http://htmlpurifier.org/
Сентябрь 4th, 2008 at 09:44
да да - возможно, только у меня не прошло по фильтрации это: “<embed>
<param name=”test” value=123 />
<param name=”url” value=’http://123123.com?asdasd=123&hkajsd=1234′ />
</embed>”