XSS фильтр на основе DOMDocument
За этот пост мне не дали инвайта, поэтому после регистрации я не спешил его публиковать. Решил что тема банальна и не интересна. Но сегодня увидел топик «Не очередной XSS фильтр» и не сдержался.
Сделано на основе вот этой идеи
Когда встал вопрос об обработке постов в блоге, я первым делом попробовал использовать регулярные выражения. Пробовал я не долго, т.к. быстро понял, что в лучшем случае получится огромное нечто, напичканное сложными регэкспами. Основная проблема, кроме сложности поддержки, — контроль незакрытых тегов и неправильный их порядок.
Приведенный ниже класс (кроме того, что делает из абсолютно любой бяки валидный html код) умеет:
Первые два пункта, конечно, ключевые. Остальной функционал оставил, чтобы показать насколько просто расширять класс под свои нужды.
Преобразование к HTML-ENTITIES и обратно к UTF-8 нужно для сохранения нормального вида символов. Уже не нужно. Спасибо LastDragon!
Первый параметр — массив вида соответствий тегов и допустимых атрибутов или строка вида «cut[text], hr[class|width|size], a[href], p».
Второй параметр — соответствие «элемент» => «стили» => «допустимые значения». Допустимые значения стилей могут задаваться в виде регулярного выражения либо массива (массив оставлен, потому что in_array быстрее регулярки).
Код класса
UPD: Кстати о парсерах. Хабр-парсер наотрез отказывается воспринимать конструкцию вида <font color="#000">0</font> Если перед нулем поставить «1» — то все ок.
Попробуйте оставить ее в каментах.
Сделано на основе вот этой идеи
Когда встал вопрос об обработке постов в блоге, я первым делом попробовал использовать регулярные выражения. Пробовал я не долго, т.к. быстро понял, что в лучшем случае получится огромное нечто, напичканное сложными регэкспами. Основная проблема, кроме сложности поддержки, — контроль незакрытых тегов и неправильный их порядок.
Приведенный ниже класс (кроме того, что делает из абсолютно любой бяки валидный html код) умеет:
- удалять лишние теги и атрибуты
- проверять стили (можно ограничить список стилей и значение для каждого)
- удалять атрибут тега «a» со значением «javascript:“
- добавляет во внешние ссылки атрибут target="_blank»
- крайне легко расширяем
- все правила фильтрации основаны на списках разрешенных значений
- сохраняет текст, который был внутри запрещенных тегов
Первые два пункта, конечно, ключевые. Остальной функционал оставил, чтобы показать насколько просто расширять класс под свои нужды.
Первый параметр — массив вида соответствий тегов и допустимых атрибутов или строка вида «cut[text], hr[class|width|size], a[href], p».
Второй параметр — соответствие «элемент» => «стили» => «допустимые значения». Допустимые значения стилей могут задаваться в виде регулярного выражения либо массива (массив оставлен, потому что in_array быстрее регулярки).
Код класса
UPD: Кстати о парсерах. Хабр-парсер наотрез отказывается воспринимать конструкцию вида <font color="#000">0</font> Если перед нулем поставить «1» — то все ок.
Попробуйте оставить ее в каментах.



комментарии (50)