处理提交表单数据中的HTML安全问题
有没有一种通用的“表单清理工具”,可以用来确保提交的表单中所有的HTML和脚本都被去掉?form.clean()
似乎没有做到这一点——在cleaned_data
中,HTML标签还是都在。难道我只能手动去做这些(并且重写表单的clean()
方法)吗?
3 个回答
35
另外,有一个叫做 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)
55
strip_tags
这个函数实际上是把输入中的标签去掉,这可能不是你想要的效果。
如果你想把一个字符串转换成“安全字符串”,也就是把尖括号、和号以及引号转换成对应的HTML实体,可以使用 escape 过滤器:
from django.utils.html import escape
message = escape(form.cleaned_data['message'])
36
Django自带一个叫做 striptags 的模板过滤器,你可以在模板中使用它:
value|striptags
它使用了一个叫 strip_tags
的函数,这个函数在 django.utils.html
里面。你也可以用它来清理你的表单数据:
from django.utils.html import strip_tags
message = strip_tags(form.cleaned_data['message'])