【问题标题】:How to prevent XSS attacks when I need to render HTML from a WYSIWYG editor?当我需要从 WYSIWYG 编辑器呈现 HTML 时,如何防止 XSS 攻击?
【发布时间】:2011-10-13 10:24:48
【问题描述】:

非技术背景信息:我在一所学校工作,我们正在使用 Django 构建一个新网站。为学校工作的教师在技术上没有足够的能力使用另一种 MarkUp 语言,例如 MarkDown。我们最终决定我们应该使用一个所见即所得的编辑器,这会带来安全漏洞。我们并不太担心老师本身,而是更担心可能获得老师证书的恶意学生。

技术背景信息:我们使用 Django 1.3 运行,尚未选择特定的编辑器。我们倾向于使用 TINYMCE 之类的 javascript,但可以说服使用任何允许安全性和易用性的东西。因为 WYSIWYG 编辑器会输出 HTML 以呈现到文档中,所以我们不能简单地对其进行转义。

什么是防止恶意代码的最佳方法,同时又能让非技术教师轻松写帖子?

【问题讨论】:

  • [旁注:ckEditor 有一些漂亮的 django 集成,包括图片上传和浏览包。 TinyMCE 的好替代品。不确定这是否有助于解决 XSS 问题!]

标签: html django security wysiwyg


【解决方案1】:

这有点晚了,但你可以试试Bleach,它在后台使用了 html5lib,而且你还可以获得标签平衡。

这是一个完整的sn-p:

settings.py

BLEACH_VALID_TAGS = ['p', 'b', 'i', 'strike', 'ul', 'li', 'ol', 'br',
                     'span', 'blockquote', 'hr', 'a', 'img']
BLEACH_VALID_ATTRS = {
    'span': ['style', ],
    'p': ['align', ],
    'a': ['href', 'rel'],
    'img': ['src', 'alt', 'style'],
}
BLEACH_VALID_STYLES = ['color', 'cursor', 'float', 'margin']

app/forms.py

import bleach
from django.conf import settings

class MyModelForm(forms.ModelForm):
    myfield = forms.CharField(widget=MyWYSIWYGEditor)


    class Meta:
        model = MyModel

    def clean_myfield(self):
        myfield = self.cleaned_data.get('myfield', '')
        cleaned_text = bleach.clean(myfield, settings.BLEACH_VALID_TAGS, settings.BLEACH_VALID_ATTRS, settings.BLEACH_VALID_STYLES)
        return cleaned_text #sanitize html

您可以阅读bleach docs,以便根据您的需要调整它。

【讨论】:

    【解决方案2】:

    您需要在服务器上解析 HTML 并删除任何不符合严格白名单的标签和属性。
    您应该将其解析(或至少重新渲染)为严格的 XML,以防止攻击者利用模糊解析器之间的差异。

    白名单不得包含<script><style><link><meta>,且不得包含事件处理程序属性或style=""

    您还必须解析 href=""src="" 中的 URL,并确保它们是相对路径、http://https://

    【讨论】:

      【解决方案3】:

      @SLaks 是正确的,您需要在服务器上进行清理,因为窃取教师凭据的学生可以使用这些凭据直接 POST 到您的服务器。

      Python HTML sanitizer / scrubber / filter 讨论了现有的可用于 python 的 HTML sanitizer。

      我建议从一个空的白名单开始,然后使用 WYSIWYG 编辑器使用每个按钮创建 HTML 的 sn-p,以便您了解它产生的 HTML 种类,然后仅将所需的标签/属性列入白名单支持它生成的 HTML。希望它不使用 CSS style 属性,因为它们也可以是 XSS 向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多