Шаблонный тег Django для рендеринга подмножества html - PullRequest
2 голосов
/ 10 ноября 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 10 ноября 2009

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

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

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

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

0 голосов
/ 07 мая 2012

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

0 голосов
/ 10 ноября 2009

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

{{ data|removetags:"script" }}
...