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

Jac*_*son 10 html security django wysiwyg

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

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

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

nit*_*ely 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']
Run Code Online (Sandbox Code Playgroud)

应用程序/ 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
Run Code Online (Sandbox Code Playgroud)

您可以阅读漂白文档,以便根据自己的需要进行调整.


SLa*_*aks 7

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

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

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