在提交的表单数据中清理 HTML
Posted
技术标签:
【中文标题】在提交的表单数据中清理 HTML【英文标题】:Sanitizing HTML in submitted form data 【发布时间】:2011-08-04 06:08:23 【问题描述】:是否有一个通用的“表单清理器”可以用来确保从提交的表单中删除所有 html/脚本? form.clean()
似乎没有做任何事情 - html 标签仍然在 cleaned_data
中。或者实际上手动完成所有这些(并覆盖表单的clean()
方法)是我唯一的选择?
【问题讨论】:
相关:***.com/q/699468/212218 【参考方案1】:strip_tags
实际上是从输入中删除标签,这可能不是你想要的。
要将字符串转换为“安全字符串”,将尖括号、与号和引号转换为相应的 HTML 实体,您可以使用escape 过滤器:
from django.utils.html import escape
message = escape(form.cleaned_data['message'])
【讨论】:
【参考方案2】:Django 带有一个名为striptags 的模板过滤器,您可以在模板中使用它:
value|striptags
它使用位于django.utils.html
中的函数strip_tags
。你也可以利用它来清理你的表单数据:
from django.utils.html import strip_tags
message = strip_tags(form.cleaned_data['message'])
【讨论】:
"请注意,strip_tags 结果可能仍包含不安全的 HTML 内容,因此您可以使用 escape() 使其成为安全字符串。" - docs.djangoproject.com/en/dev/ref/utils/… Strip_tags() 单独是不够的,而 strip_tags() + escape() 组合会产生非常丑陋的文本——尤其是在它合法包含撇号的地方。只需使用bleach.clean()。 有什么理由去掉标签吗?如果用户提交标签之类的东西,最好将其转义,但让它看起来像输入。假设我输入了<sarcasm>bad joke</sarcasm>
之类的内容【参考方案3】:
另外,还有一个名为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)
【讨论】:
以上是关于在提交的表单数据中清理 HTML的主要内容,如果未能解决你的问题,请参考以下文章
如何在 reactjs 中使用 recompose 清理表单?
如何使用PHP在数据库中保存HTML META和JavaScript?