【问题标题】:Sanitizing HTML in submitted form data在提交的表单数据中清理 HTML
【发布时间】:2021-04-18 00:09:23
【问题描述】:

是否有一个通用的“表单清理器”可以用来确保从提交的表单中删除所有 html/脚本? form.clean() 似乎没有做任何事情 - html 标签仍然在 cleaned_data 中。或者实际上手动完成所有这些(并覆盖表单的clean() 方法)是我唯一的选择?

【问题讨论】:

标签: python django forms sanitization


【解决方案1】:

strip_tags 实际上是从输入中删除标签,这可能不是你想要的。

要将字符串转换为“安全字符串”,将尖括号、与号和引号转换为相应的 HTML 实体,您可以使用escape 过滤器:

from django.utils.html import escape
message = escape(form.cleaned_data['message'])

【讨论】:

    【解决方案2】:

    另外,还有一个名为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)
    

    【讨论】:

      【解决方案3】:

      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> 之类的内容
      猜你喜欢
      • 2023-03-30
      • 2021-09-24
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      相关资源
      最近更新 更多