【发布时间】:2021-04-18 00:09:23
【问题描述】:
是否有一个通用的“表单清理器”可以用来确保从提交的表单中删除所有 html/脚本? form.clean() 似乎没有做任何事情 - html 标签仍然在 cleaned_data 中。或者实际上手动完成所有这些(并覆盖表单的clean() 方法)是我唯一的选择?
【问题讨论】:
标签: python django forms sanitization
是否有一个通用的“表单清理器”可以用来确保从提交的表单中删除所有 html/脚本? form.clean() 似乎没有做任何事情 - html 标签仍然在 cleaned_data 中。或者实际上手动完成所有这些(并覆盖表单的clean() 方法)是我唯一的选择?
【问题讨论】:
标签: python django forms sanitization
strip_tags 实际上是从输入中删除标签,这可能不是你想要的。
要将字符串转换为“安全字符串”,将尖括号、与号和引号转换为相应的 HTML 实体,您可以使用escape 过滤器:
from django.utils.html import escape
message = escape(form.cleaned_data['message'])
【讨论】:
另外,还有一个名为bleach的Python库:
Bleach 是一个基于白名单的 HTML 清理和文本链接库。它旨在通过 some 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)
【讨论】:
Django 带有一个名为striptags 的模板过滤器,您可以在模板中使用它:
value|striptags
它使用位于django.utils.html 中的函数strip_tags。你也可以利用它来清理你的表单数据:
from django.utils.html import strip_tags
message = strip_tags(form.cleaned_data['message'])
【讨论】:
<sarcasm>bad joke</sarcasm> 之类的内容