Использование безопасного фильтра в Django для форматированных текстовых полей

Я использую редактор TinyMCE для полей текстовых областей в Django формы.

Теперь, чтобы отобразить расширенный текст обратно пользователю, я вынужден использовать «безопасный» фильтр в шаблонах Django, чтобы в браузере отображался расширенный текст HTML.

Предположим, в браузере пользователя отключен JavaScript, TinyMCE не загружается, и пользователь может передать <script> или другой XSS. теги из такого поля textarea. Такой HTML небезопасно отображать пользователю.

Как мне позаботиться о таком небезопасном тексте HTML, который не исходит от TinyMCE?


person Community    schedule 12.09.2009    source источник


Ответы (4)


Вы правы, беспокоясь о необработанном HTML, но не только для браузеров с отключенным Javascript. Рассматривая безопасность своего сервера, вы должны игнорировать любую работу, выполняемую в браузере, и смотреть исключительно на то, что сервер принимает и что с ним происходит. Ваш сервер принимает HTML и отображает его на странице. Это небезопасно.

Тот факт, что TinyMce цитирует HTML, является ложной безопасностью: сервер доверяет тому, что принимает, а не должен.

Решение этой проблемы состоит в том, чтобы обрабатывать HTML, когда он поступает, чтобы удалить опасные конструкции. Это сложная проблема для решения. Взгляните на Шпаргалку по XSS, чтобы увидеть широкий спектр входных данных, которые могут вызвать проблему. .

В lxml есть функция очистки HTML: http://lxml.de/lxmlhtml.html#cleaning-up-html, но я им никогда не пользовался, поэтому не могу ручаться за его качество.

person Ned Batchelder    schedule 12.09.2009
comment
Шпаргалка XSS — хороший пример того, почему внедрение подпрограмм очистки HTML — довольно бесполезный процесс. Внесение html-тегов в белый список — действительно единственный способ полностью избежать этого. - person Paul McMillan; 12.09.2009
comment
+1 за замечательную ссылку. Я думаю, что в моих будущих приложениях для этого будет меньше дыр. Спасибо. - person Fábio Santos; 21.12.2012

Используйте django-bleach. Это дает вам фильтр шаблона bleach, который позволяет вам отфильтровывать только те теги, которые вы хотите:

{% load bleach_tags %}
{{ mymodel.my_html_field|bleach }}

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

Вот пример моих настроек отбеливателя:

# Which HTML tags are allowed
BLEACH_ALLOWED_TAGS = ['p', 'h3', 'h4', 'em', 'strong', 'a', 'ul', 'ol', 'li', 'blockquote']
# Which HTML attributes are allowed
BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'name']
BLEACH_STRIP_TAGS = True

Затем вы можете настроить TinyMCE (или любой другой WYSIWYG-редактор, который вы используете) только на кнопки, создающие разрешенные теги.

person seddonym    schedule 17.12.2014
comment
это то, что мне было нужно! Спасибо! - person Jason Howard; 14.04.2019

Вы можете использовать фильтр шаблона "removetags" и просто удалить «скрипт».

Обратите внимание, что removetags был удален из Django 2.0. Вот уведомление об устаревании из документации:

Устарело, начиная с версии 1.8: removetags не может гарантировать безопасный вывод HTML и устарело из соображений безопасности. Рассмотрите возможность использования bleach вместо этого.

person AbeEstrada    schedule 31.07.2010
comment
Пожалуйста, не делайте этого. Помимо использования тега <script>, у злоумышленника есть много способов внедрить javascript. Вот длинный список, но простым примером будет <a href="javascript:alert(1)">x</a>. Это сложная задача, требующая специального инструмента. Для Django хорошим решением является Bleach. - person Kevin Christopher Henry; 02.07.2014
comment
Удаление тегов фильтра будет объявлено устаревшим в версии 1.8. В документации по разработке предлагается использовать отбеливатель. По этому предложению я создал простой фильтр. - person Brent O'Connor; 17.09.2014

На этот вопрос нет хорошего ответа. TinyMCE генерирует HTML, а автоматическое экранирование django специально удаляет HTML.

Традиционное решение этой проблемы состояло в том, чтобы либо использовать какой-либо язык разметки, отличный от HTML, на стороне пользовательского ввода (bbcode, markdown и т. д.), либо внести в белый список ограниченное количество тегов HTML. TinyMCE/HTML, как правило, подходят только для более или менее доверенных пользователей.

Подход с использованием белого списка сложно реализовать без каких-либо дыр в безопасности. Единственное, что вы не хотите делать, это пытаться просто обнаружить «плохие» теги - вы пропустите крайние случаи.

person Paul McMillan    schedule 12.09.2009