2009-11-10 7 views
2

У меня есть некоторый html (в данном случае созданный через TinyMCE), который я хотел бы добавить на страницу. Однако по соображениям безопасности я не хочу просто печатать все, что ввел пользователь.Django templatetag для рендеринга подмножества html

Кто-нибудь знает о templatetag (фильтр, желательно), который позволит отображать только безопасное подмножество html?

Я понимаю, что уценка и другие делают это. Однако они также добавляют дополнительный синтаксис разметки, который может сбивать с толку для моих пользователей, поскольку они используют богатый текстовый редактор, который не знает об уценке.

ответ

6

Там в removetags, но это черный список подход, который не удается удалить тег, когда они не выглядят так же, как хорошо сформированные теги Django ожидает, и, конечно, поскольку он не пытается удалить атрибуты, он полностью уязвим для 1000 других способов инъекции скрипта, которые не включают тег <script>. Это ловушка, предлагающая иллюзию безопасности, фактически не обеспечивающая реальной безопасности.

Подходы с использованием HTML-санитарии, основанные на взломе регулярных выражений, почти неизбежно полностью терпят неудачу. Использование реального парсера HTML для получения объектной модели для представленного контента, то фильтрация и повторная сериализация в хорошо известном формате, как правило, является самым надежным подходом.

Если ваш текстовый редактор выводит XHTML, это просто, просто используйте minidom или etree для анализа документа, затем перейдите к нему, удалив все, кроме хорошо известных элементов и атрибутов, и, наконец, вернитесь к безопасному XML. Если, с другой стороны, он выплескивает HTML или позволяет пользователю вводить необработанный HTML-код, вам может понадобиться использовать что-то вроде BeautifulSoup. См. this question для обсуждения.

Фильтрация HTML - это сложная и сложная тема, поэтому многие предпочитают языки с расширением текста.

-1

Вы можете использовать removetags указать список тегов, удалить:

{{ data|removetags:"script" }} 
+2

-1 Это хуже, чем ничего, поскольку это создает иллюзию безопасности без реальных преимуществ. Существует миллион способов такого подхода к черным спискам. –

0

Используйте HTML-очиститель, html5lib или другую библиотеку, созданную для обработки HTML-данных.