【问题标题】:Using safe filter in Django for rich text fields在 Django 中为富文本字段使用安全过滤器
【发布时间】:2010-11-27 18:00:36
【问题描述】:

我正在使用TinyMCE 编辑器来处理Django 表单中的textarea 文件。

现在,为了向用户显示富文本,我不得不在 Django 模板中使用“安全”过滤器,以便可以在浏览器上显示 HTML 富文本。

假设 JavaScript 在用户的浏览器上被禁用,TinyMCE 将不会加载,用户可以从这样的 textarea 字段传递<script> 或其他XSS 标签。这样的 HTML 显示给用户是不安全的。

我该如何处理这些并非来自 TinyMCE 的不安全 HTML 文本?

【问题讨论】:

    标签: python django django-templates filter


    【解决方案1】:

    使用django-bleach。这为您提供了一个bleach 模板过滤器,允许您只过滤掉您想要的标签:

    {% load bleach_tags %}
    {{ mymodel.my_html_field|bleach }}
    

    诀窍是配置编辑器以生成与您愿意在漂白设置中“通过”相同的标签。

    这是我的漂白设置示例:

    # Which HTML tags are allowed
    BLEACH_ALLOWED_TAGS = ['p', 'h3', 'h4', 'em', 'strong', 'a', 'ul', 'ol', 'li', 'blockquote']
    # Which HTML attributes are allowed
    BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'name']
    BLEACH_STRIP_TAGS = True
    

    然后您可以配置 TinyMCE(或您正在使用的任何 WYSIWYG 编辑器)仅具有创建允许标签的按钮。

    【讨论】:

    • 这就是我需要的!谢谢!
    【解决方案2】:

    您对原始 HTML 的关注是正确的,但不仅仅针对禁用 Javascript 的浏览器。在考虑服务器的安全性时,您必须忽略浏览器中所做的任何工作,而只关注服务器接受的内容以及发生的情况。您的服务器接受 HTML 并将其显示在页面上。这是不安全的。

    TinyMce 引用 HTML 的事实是一种虚假的安全性:服务器信任它接受的内容,但它不应该这样做。

    解决方案是在 HTML 到达时对其进行处理,以删除危险的结构。这是一个需要解决的复杂问题。查看XSS Cheat Sheet,了解可能导致问题的各种输入。

    lxml有一个清理HTML的功能:http://lxml.de/lxmlhtml.html#cleaning-up-html,但是我没用过,所以不能保证它的质量。

    【讨论】:

    • XSS 备忘单是一个很好的例子,说明了为什么实现 HTML 清理例程是一个相当徒劳的过程。将 html 标签列入白名单确实是完全避免这种情况的唯一方法。
    • +1 获取精彩链接。我认为我未来的应用程序会有更少的漏洞。谢谢。
    【解决方案3】:

    您可以使用模板过滤器“removetags”并删除“脚本”。

    请注意,removetags 已从 Django 2.0 中删除。这是文档中的弃用通知:

    自 1.8 版起已弃用: removetags 无法保证 HTML 安全输出,出于安全考虑已弃用。考虑改用bleach

    【讨论】:

    • 请不要这样做。除了使用<script> 标签外,攻击者还有很多方法可以注入javascript。 Here 是一个很长的列表,但一个简单的例子是 <a href="javascript:alert(1)">x</a>。这是一个难题,需要专用工具。对于 Django,一个好的解决方案是 Bleach
    • 过滤器 removetags 将在 1.8 版中被弃用。开发文档建议使用漂白剂。根据这个建议,我自己 created a simple filter
    【解决方案4】:

    这个问题没有一个好的答案。 TinyMCE 生成 HTML,django 的 auto-escape 专门删除 HTML。

    解决此问题的传统方法是在用户输入端使用一些非 html 标记语言(bbcode、markdown 等)或将有限数量的 HTML 标记列入白名单。 TinyMCE/HTML 通常只适合或多或少受信任的用户的输入解决方案。

    在没有任何安全漏洞的情况下,白名单方法很难实施。您不想做的一件事是尝试检测“坏”标签 - 您会错过边缘情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-13
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2018-03-29
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多