当我需要从WYSIWYG编辑器渲染HTML时如何防止XSS攻击?

时间:2011-07-26 13:34:03

标签: html django security wysiwyg

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

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

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

3 个答案:

答案 0 :(得分:15)

这已经很晚了,但你可以试试Bleach,它会使用html5lib,你也可以获得标签平衡。

这是一个完整的代码段:

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']

应用程序/ 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,以便根据自己的需要进行调整。

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:0)

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

Python HTML sanitizer / scrubber / filter讨论了python可用的现有HTML清理程序。

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