我在Django表单中使用TinyMCE编辑器来处理textarea文件.
现在,为了将富文本显示回用户,我不得不在Django模板中使用"安全"过滤器,以便可以在浏览器上显示HTML富文本.
假设在用户的浏览器上禁用了JavaScript,TinyMCE将无法加载,用户可以从这样的textarea字段传递或其他XSS标记.这样的HTML无法安全地显示给用户.
如何处理不是来自TinyMCE的不安全的HTML文本?
您关注原始HTML是正确的,但不仅仅是针对禁用Javascript的浏览器.在考虑服务器的安全性时,您必须忽略浏览器中完成的任何工作,并仅查看服务器接受的内容以及发生的情况.您的服务器接受HTML并在页面上显示它.这是不安全的.
TinyMce引用HTML的事实是一种错误的安全性:服务器信任它所接受的内容,而不应该信任它.
解决方案是在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 "并删除"脚本".