Django templatetag用于呈现html的子集

时间:2009-11-10 17:40:38

标签: html django django-templates markdown templatetags

我有一些html(在这种情况下通过TinyMCE创建)我想添加到页面。但是,出于安全原因,我不想只打印用户输入的所有内容。

有没有人知道一个模板标签(最好是一个过滤器),它只允许渲染一个安全的html子集?

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

3 个答案:

答案 0 :(得分:6)

removetags,但它是一种黑名单方法,当它们看起来不像Django期望的格式良好的标签时,它无法删除标签,当然因为它不会尝试删除属性完全容易受到1000个其他不涉及<script>标记的脚本注入方式的影响。这是一个陷阱,提供安全的幻觉,而实际上根本没有真正的安全。

基于正则表达式黑客攻击的HTML-sanitisation方法几乎不可避免地完全失败。使用真正的HTML解析器获取提交内容的对象模型,然后以已知良好的格式进行过滤和重新序列化,通常是最可靠的方法。

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

过滤HTML是一个庞大而复杂的主题,这就是为什么许多人更喜欢带限制文本的文本。

答案 1 :(得分:0)

使用HTML Purifier,html5lib或其他用于执行HTML清理的库。

答案 2 :(得分:-1)

您可以使用removetags指定要删除的标记列表:

{{ data|removetags:"script" }}