CKEditor用户输入(django)的服务器端验证

CKEditor用户输入(django)的服务器端验证,django,ckeditor,Django,Ckeditor,我想在我的应用程序中使用CKEditor,用户(任何人)都可以在其中发布文章,但我不确定它是否安全。在django模板中渲染时,我必须将来自CKEditor的文本标记为“安全”,以获得预期的结果。根据Django文档,不建议关闭未知来源的转义输入文本。甚至CKEditor也提到输入应该是干净的HTML CKEditor可以用于我的用例吗?如果是这样,我需要一些建议,以避免任何安全问题。谢谢大家! 您可以编写一个CKEditor小部件,在添加不可信的输入后,使用漂白剂库等工具对其进行清理。根据需要

我想在我的应用程序中使用CKEditor,用户(任何人)都可以在其中发布文章,但我不确定它是否安全。在django模板中渲染时,我必须将来自CKEditor的文本标记为“安全”,以获得预期的结果。根据Django文档,不建议关闭未知来源的转义输入文本。甚至CKEditor也提到输入应该是干净的HTML


CKEditor可以用于我的用例吗?如果是这样,我需要一些建议,以避免任何安全问题。谢谢大家!

您可以编写一个CKEditor小部件,在添加不可信的输入后,使用漂白剂库等工具对其进行清理。根据需要调整标签:

import bleach
from ckeditor.fields import RichTextField

ALLOWED_TAGS = set(bleach.ALLOWED_TAGS + [ 
    'a', 'blockquote', 'code', 'del', 'dd', 'dl', 'dt', 
    'h1', 'h2', 'h3', 'h3', 'h4', 'h5', 'i', 'img', 'kbd', 
    'li', 'ol', 'ul', 'p', 'pre', 's', 'sup', 'sub', 'em', 
    'strong', 'strike', 'ul', 'br', 'hr' ]) 

ALLOWED_STYLES = set(bleach.ALLOWED_STYLES + [ 
    'color', 'background-color', 'font', 'font-weight', 
    'height', 'max-height', 'min-height', 
    'width', 'max-width', 'min-width', ]) 

ALLOWED_ATTRIBUTES = {}   
ALLOWED_ATTRIBUTES.update(bleach.ALLOWED_ATTRIBUTES) 
ALLOWED_ATTRIBUTES.update({ 
    '*': ['class', 'title'], 
    'a': ['href', 'rel'], 
    'img': ['alt', 'src', 'width', 'height', 'align', 'style'], 
})


def bleach_clean(html): 
    """ Cleans given HTML with bleach.clean() """ 
    return bleach.clean(
        html, 
        tags=ALLOWED_TAGS, 
        attributes=ALLOWED_ATTRIBUTES, 
        styles=ALLOWED_STYLES, 
        strip=True
    ) 


class RichTextBleachField(RichTextField):
    def __init__(self, *args, **kwargs): 
        super(RichTextBleachField, self).__init__(*args, **kwargs) 
    def to_python(self, value): 
        return bleach_clean(value) 

我们将其用于一些受安全约束的项目,效果很好。漂白剂还知道如何修复损坏的HTML,因此我们可以免费使用该字段进行验证,该字段非常容易用于模型和表单。

谢谢!非常感谢。这应该可以解决我的问题,因为你已经在使用它了。我将在未来几天内尝试。我会更新你的。刚刚尝试过。。我正要删除此功能,但多亏了你,它现在已成为我项目的一部分。很高兴听到你这么说!祝你圣诞快乐,祝你的项目好运。