我有一些html(在这种情况下通过TinyMCE创建)我想添加到页面。但是,出于安全原因,我不想只打印用户输入的所有内容。
有没有人知道一个模板标签(最好是一个过滤器),它只允许渲染一个安全的html子集?
我意识到降价和其他人这样做。但是,它们还添加了额外的标记语法,这可能会让我的用户感到困惑,因为他们使用的是不知道降价的富文本编辑器。
答案 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" }}