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)
您可以阅读漂白文档,以便根据自己的需要进行调整.
您需要解析服务器上的HTML并删除任何不符合严格白名单的标记和属性.
您应该将其解析(或至少重新呈现)为严格的XML,以防止攻击者利用模糊解析器之间的差异.
白名单不得包括<script>,<style>,<link>,或者<meta>,不得包括事件处理程序属性或style="".
您还必须在href=""和中解析URL,并src=""确保它们是相对路径http://,或https://.