在提交的表单数据中清理 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的主要内容,如果未能解决你的问题,请参考以下文章

在提交到数据库之前使用 django 清理数据弹出删除数据

如何在 reactjs 中使用 recompose 清理表单?

清理和验证表单php

如何使用PHP在数据库中保存HTML META和JavaScript?

在HTML中,建立一个提交表单页面,提交后可以直接在数据库看见。

在HTML中,建立一个提交表单页面,提交后可以直接在数据库看见。