在Django中使用安全过滤器来获取富文本字段

时间:2009-09-12 12:20:59

标签: python django django-templates filter

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

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

假设在用户的浏览器上禁用了JavaScript,TinyMCE将无法加载,用户可以从此类textarea字段传递<script>或其他XSS标记。这样的HTML无法安全地显示给用户。

如何处理不是来自TinyMCE的不安全的HTML文本?

4 个答案:

答案 0 :(得分:12)

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

TinyMce引用HTML的事实是一种错误的安全性:服务器信任它所接受的内容,而不是它所接受的内容。

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:7)

使用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编辑器),只有拥有创建允许标签的按钮。

答案 3 :(得分:3)

这个没有一个好的答案。 TinyMCE生成HTML,而django的自动转义专门删除HTML。

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

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