在Django中为富文本字段使用安全过滤器

2024-05-23 17:00:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在对Django表单中的文本区域文件使用TinyMCE编辑器。

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

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

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


Tags: 文件django用户文本模板区域过滤器表单
3条回答

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

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

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

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

使用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(或您正在使用的任何所见即所得编辑器)配置为只有创建允许标记的按钮。

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

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

Deprecated since version 1.8:removetags cannot guarantee HTML safe output and has been deprecated due to security concerns. Consider using bleach instead.

相关问题 更多 >