处理提交表单数据中的HTML安全问题

38 投票
3 回答
28264 浏览
提问于 2025-04-16 15:36

有没有一种通用的“表单清理工具”,可以用来确保提交的表单中所有的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'])

撰写回答