2024-05-23 17:00:21 发布
网友
我正在对Django表单中的文本区域文件使用TinyMCE编辑器。
现在,为了将富文本显示回用户,我不得不在Django模板中使用“安全”过滤器,以便在浏览器上显示HTML富文本。
假设在用户浏览器上禁用了JavaScript,TinyMCE将不会加载,用户可以从这样的textarea字段传递<script>或其他XSS标记。这样的HTML将不安全地显示回用户。
<script>
如何处理这种不安全的HTML文本,而不是来自TinyMCE?
关注原始HTML是正确的,但不只是针对禁用Javascript的浏览器。在考虑服务器的安全性时,必须忽略在浏览器中所做的任何工作,而只关注服务器接受的内容和发生的情况。您的服务器接受HTML并将其显示在页面上。这不安全。
TinyMce引用HTML的事实是一种错误的安全性:服务器信任它接受的内容,而不信任它不应该接受的内容。
解决方法是在HTML到达时处理它,删除危险的结构。这是一个需要解决的复杂问题。查看XSS Cheat Sheet以查看可能导致问题的各种输入。
lxml有一个清理HTML:http://lxml.de/lxmlhtml.html#cleaning-up-html的函数,但我从未使用过它,所以我不能保证它的质量。
使用django-bleach。这为您提供了一个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中删除。以下是文档中的弃用通知:
removetags
Deprecated since version 1.8:removetags cannot guarantee HTML safe output and has been deprecated due to security concerns. Consider using bleach instead.
关注原始HTML是正确的,但不只是针对禁用Javascript的浏览器。在考虑服务器的安全性时,必须忽略在浏览器中所做的任何工作,而只关注服务器接受的内容和发生的情况。您的服务器接受HTML并将其显示在页面上。这不安全。
TinyMce引用HTML的事实是一种错误的安全性:服务器信任它接受的内容,而不信任它不应该接受的内容。
解决方法是在HTML到达时处理它,删除危险的结构。这是一个需要解决的复杂问题。查看XSS Cheat Sheet以查看可能导致问题的各种输入。
lxml有一个清理HTML:http://lxml.de/lxmlhtml.html#cleaning-up-html的函数,但我从未使用过它,所以我不能保证它的质量。
使用django-bleach。这为您提供了一个
bleach
模板过滤器,允许您筛选出所需的标记:诀窍是将编辑器配置为生成与您愿意在漂白剂设置中“通过”相同的标记。
以下是我的漂白设置示例:
然后,您可以将TinyMCE(或您正在使用的任何所见即所得编辑器)配置为只有创建允许标记的按钮。
您可以使用模板过滤器“removetags”,只需删除“脚本”。
请注意,
removetags
已从Django 2.0中删除。以下是文档中的弃用通知:相关问题 更多 >
编程相关推荐