[英]Using safe filter in Django for rich text fields
您关心原始 HTML 是正确的,但不仅仅是针对禁用 Javascript 的浏览器。 在考虑服务器的安全性时,您必须忽略在浏览器中完成的任何工作,而只看服务器接受什么以及对它发生了什么。 您的服务器接受 HTML 并将其显示在页面上。 这是不安全的。
TinyMce 引用 HTML 的事实是一种虚假的安全性:服务器信任它接受的内容,而不信任它。
对此的解决方案是在 HTML 到达时对其进行处理,以删除危险的结构。 这是一个需要解决的复杂问题。 查看XSS 备忘单,了解可能导致问题的各种输入。
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(或您正在使用的任何 WYSIWYG 编辑器),仅使用创建允许标签的按钮。
您可以使用模板过滤器“ removetags ”并删除“脚本”。
请注意, removetags
已从 Django 2.0 中删除。 这是文档中的弃用通知:
1.8 版后已弃用:
removetags
不能保证 HTML 安全输出,出于安全考虑已弃用。 考虑使用bleach
代替。
这个没有很好的答案。 TinyMCE 生成 HTML,django 的自动转义专门删除 HTML。
这个问题的传统解决方案是在用户输入端使用一些非 html 标记语言(bbcode、markdown 等),或者将有限数量的 HTML 标签列入白名单。 TinyMCE/HTML 通常只是适合或多或少受信任用户的输入解决方案。
白名单方法很难在没有任何安全漏洞的情况下实现。 您不想做的一件事就是尝试只检测“坏”标签——您将错过边缘情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.