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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 12 сентября 2009

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

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

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

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

7 голосов
/ 17 декабря 2014

Использование 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) только для кнопок, которые создают разрешенные теги.

7 голосов
/ 31 июля 2010

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

3 голосов
/ 12 сентября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...