Существует ли общий "дезинфицирующее средство для форм", которое я могу использовать для обеспечения того, чтобы все html/scripting были удалены из представленной формы? form.clean(), похоже, ничего не делает - теги html все еще находятся в cleaned_data. Или, действительно, все это вручную (и переопределить метод clean() для формы) является моей единственной опцией?
Санитарный анализ HTML в представленных данных формы
Ответ 1
Django поставляется с фильтром шаблонов striptags, который можно использовать в шаблоне:
value|striptags
Он использует функцию strip_tags
, которая живет в django.utils.html
. Вы также можете использовать его для очистки данных формы:
from django.utils.html import strip_tags
message = strip_tags(form.cleaned_data['message'])
Ответ 2
strip_tags фактически удаляет теги из ввода, которые могут быть не такими, какие вы хотите.
Чтобы преобразовать строку в "безопасную строку" с угловыми скобками, амперсанды и кавычки, преобразованные в соответствующие объекты HTML, можно использовать escape фильтр:
from django.utils.html import escape
message = escape(form.cleaned_data['message'])
Ответ 3
В качестве альтернативы существует библиотека Python под названием bleach:
Bleach - это белая версия HTML-системы санитаризации и текстовой привязки. Он предназначен для получения ненадежного ввода пользователем некоторого HTML-кода.
Поскольку Bleach использует
html5lib
для разбора фрагментов документа так же, как это делают браузеры, он чрезвычайно устойчив к неизвестным атакам, намного больше, чем дезинфицирующие средства на основе регулярных выражений.
Пример:
import bleach
message = bleach.clean(form.cleaned_data['message'],
tags=ALLOWED_TAGS,
attributes=ALLOWED_ATTRIBUTES,
styles=ALLOWED_STYLES,
strip=False, strip_comments=True)