非技术背景信息:我在一所学校工作,我们正在使用Django建立一个新网站。为学校工作的教师在技术上没有足够的能力使用另一种MarkUp语言,如MarkDown。我们最终决定使用WYSIWYG编辑器,这会带来安全漏洞。我们并不太担心教师本身,而是更多可能获得教师资格的恶意学生。
技术背景信息:我们正在使用Django 1.3运行,尚未选择特定的编辑器。我们倾向于使用像TINYMCE这样的javascript,但可以说服它使用任何允许安全性和易用性的东西。因为WYSIWYG编辑器将输出要呈现到文档中的HTML,所以我们不能简单地将其转义。
防止恶意代码同时让非技术教师轻松撰写帖子的最佳方法是什么?
答案 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向量。