Фильтрация HTML кода

При безконтрольном вводе HTML кода на сайте, его необходимо чистить от возможных хакерских вставок, которые могут угрожать безопасности сайта. Такое уже было на хабре, многие ещё помнят "чёрного властелина", который постоянно появлялся на сайте, благодаря тому, что кто-то сумел вставить <script> тег с хакерским вирусным кодом.

Сначала решил использовать модуль Jevix, который используется в открытом "клоне хабра" LiveStreet. В нём оказалась досадная то ли ошибка, то ли фича, Jevix съедает переводы строк, включая и те, что в коде <pre><code>. Отписал автору модуля о проблеме, но когда её решат, не понятно, самостоятельно поковыряв код, я не смог исправить ситуацию. Эта проблема появляется, если на вход Jevix поступает обработанный через Markdown код, и приходится отключать экранирование тегов внутри <pre><code>.

В итоге нашёл отличную библиотеку html_filter, которая позволяет задавать список допустимых тегов и атрибутов, вырезая всё остальное. Дополнил её модулем typograf, который имеет гораздо большую функциональность, чем в Jevix. Правда типограф зашил прямо внутрь модуля html_filter, чтобы не обрабатывать им то, что находится внутри <code>.

Получившаяся связка из двух библиотек по объему кода получилась меньше, 30 Кб вместо 56 Кб, что теоретически должно сказаться на производительности.

По ходу различных тестов выявил опасную ошибку в модуле Markdown Extra, позволяющую вставлять <script> тег внутрь <pre><code> так как есть, без экранирования символов <>, устранил её хирургическим путём, убрав одну, не нужную мне, функцию этой библиотеки.

Полезные ссылки

30 марта 2011