在提交的表单数据中清理HTML

abo*_*nov 29 python forms django sanitization

是否有一个通用的"表单清理程序",我可以用来确保从提交的表单中删除所有的html /脚本?form.clean()似乎没有做任何事情 - html标签仍然在cleaning_data中.或者实际上手动执行此操作(并覆盖表单的clean()方法)是我唯一的选择?

sim*_*mao 47

strip_tags实际上从输入中删除了标记,这可能不是您想要的.

要将字符串转换为带有尖括号,&符号和引号转换为相应HTML实体的"安全字符串",可以使用转义过滤器:

from django.utils.html import escape
message = escape(form.cleaned_data['message'])
Run Code Online (Sandbox Code Playgroud)


Ber*_*ant 29

Django附带了一个名为striptags的模板过滤器,您可以在模板中使用它:

value|striptags
Run Code Online (Sandbox Code Playgroud)

它使用了strip_tags生活中的功能django.utils.html.您也可以利用它来清理表单数据:

from django.utils.html import strip_tags
message = strip_tags(form.cleaned_data['message'])
Run Code Online (Sandbox Code Playgroud)

  • "请注意,strip_tags结果可能仍包含不安全的HTML内容,因此您可以使用escape()将其设置为安全字符串." - https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.html.strip_tags (5认同)
  • 是否有任何理由去除标签?如果用户提交标签之类的东西,最好将其转义,但使其看起来像输入。假设我输入了诸如“<讽刺>坏笑话</讽刺>”之类的内容 (3认同)

Wto*_*wer 20

或者,有一个名为bleach的Python库:

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)
Run Code Online (Sandbox Code Playgroud)