代码之家  ›  专栏  ›  技术社区  ›  Craig McQueen

用于呈现HTML子集的Django模板标记

  •  2
  • Craig McQueen  · 技术社区  · 16 年前

    我有一些HTML(在本例中是通过tinymce创建的)要添加到页面中。但是,出于安全原因,我不想只打印用户输入的所有内容。

    是否有人知道只允许呈现安全的HTML子集的模板标记(最好是筛选器)?

    我意识到降价和其他人会这样做。但是,它们还添加了额外的标记语法,这可能会让我的用户感到困惑,因为它们使用的是一个不了解标记的富文本编辑器。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

    removetags 但这是一种黑名单方法,当标签看起来与Django所期望的格式不完全一致时,它无法删除标签,当然,由于它不尝试删除属性,因此它完全容易受到1000种其他不涉及 <script> 标签。这是一个陷阱,提供了安全的假象,但实际上根本没有提供真正的安全。

    基于regex黑客技术的HTML消毒方法几乎不可避免地会彻底失败。使用一个真正的HTML解析器为提交的内容获取一个对象模型,然后以已知良好的格式过滤和重新序列化,通常是最可靠的方法。

    如果富文本编辑器输出XHTML很简单,只需使用minidom或etree解析文档,然后遍历它,删除所有已知良好的元素和属性,最后转换回安全的XML。另一方面,如果它吐出HTML,或者允许用户输入原始HTML,那么您可能需要在它上面使用一些类似于beautifulsoup的东西。见 this question 进行讨论。

    筛选HTML是一个大而复杂的主题,这就是为什么许多人喜欢使用限制性标记语言的文本。

        2
  •  0
  •   D.W.    14 年前

    使用HTML净化程序、HTML5lib或其他为执行HTML清理而构建的库。

        3
  •  -1
  •   Aleksei Potov    16 年前

    你可以使用 removetags 要指定要删除的标记列表,请执行以下操作:

    {{ data|removetags:"script" }}