使用django模型、模板和drf序列化器轻松接受html输入
django-tidyfields的Python项目详细描述
Version: | 1.1.0 |
---|---|
Source: | https://gitlab.routh.io/open-source/python/django_tidyfields |
Keywords: | ^{tt1}$ ^{tt2}$ ^{tt3}$ ^{tt4}$ ^{tt5}$ |
PythonVersion: | 3.6+ |
清除来自API端点或视图的HTML输入
内容
1 Features
- 利用lxml的能力过滤模型字段
- 支持来自任何源的输入,因为筛选是由模型保存触发的
2 Installation
2.1 Requirements
- Python 3.6或更高版本
- setuptools 30.3.0或更高版本
- django 2.0或更高版本
2.2 Install
通过pip安装django_tidyfields:
pip install django-tidyfields
将django tidyfields添加到INSTALLED_APPS:
INSTALLED_APPS=[# ...'django_tidyfields',# ...]
2.3 Configure
这些字段将lxml.html.clean.cleaner类的预期参数直接传递到cleaner实例。我们会尽力 使文档与最新的集成lxml版本保持一致,但是这些参数可能会根据 lxml的开发。有关https://lxml.de的详细信息
3 Usage
django tidyfields子类django textfield和charfield类,并获取它们可用的任何参数。
您可以选择在django设置中全局配置该字段:
""" Empty dict example, showing all parameters available, at their defaults. """TIDYFIELDS={'processing_instructions':True,'javascript':True,'comments':True,'style':True,'allow_tags':[],'remove_unknown_tags':False,'kill_tags':['script','style'],'safe_attrs_only':True,'safe_attrs':[],'add_nofollow':True,'scripts':True,'inline_style':None,'links':True,'meta':True,'page_structure':True,'embedded':True,'frames':True,'forms':True,'annoying_tags':True,'remove_tags':None,'host_whitelist':[],'whitelist_tags':{}}
并且您可以覆盖使用django tidyfields的每个模型的特定参数。此处未设置的参数将继承自 全局设置或来自lxml.html.clean.cleaner本身。复习lxml documentation 对于漂白剂默认参数。
models.py:
""" A minimal Models.py usage example """fromdjango.db.modelsimportModelfromdjango_tidyfields.fieldsimportTidyTextField,TidyCharFieldclassUserSubmission(Model):title=TidyCharField()description=TidyTextField()body=TidyTextField()
4 Advanced Usage
django tidyfields可以根据您的喜好使用,但是我们建议您的全局默认值是最小值 允许设置一组标记,或者设置为删除所有内容。如果你的项目只允许 textfields例如,它意味着在需要html的地方有许多charfields和textfields 脱光衣服。
在模型中直接定义字段时,可以定义允许的标记,但也可以定义添加 在django设置中使用具有唯一变量名的默认值,并在任何允许 标签。字段检查是否在field_args参数中设置了任何参数,并且只重写 如果再次传递相同的参数,则为默认参数。所以你可以用加法和减法魔法 尽可能简化代码。记住巫师的第二条规则!(尤其是在使用减法时 魔法)
“The Second Rule is that the greatest harm can result from the best intentions. It sounds a paradox, but kindness and good intentions can be an insidious path to destruction. Sometimes doing what seems right is wrong and can cause harm. The only counter to it is knowledge, wisdom, forethought, and understanding the First Rule. Even then, that is not always enough.”– Zedd Zu’l ZoranderStone of Tears, Terry Goodkind
4.1 An Additive example
settings.py:
""" Default dict that strips all HTML, with a permissive dict for certain fields. """TIDYFIELDS={'processing_instructions':True,'javascript':True,'comments':True,'style':True,'allow_tags':[''],'remove_unknown_tags':False,'kill_tags':['script','style'],'safe_attrs_only':True,'safe_attrs':[''],'add_nofollow':True}PERMISSIVE_TIDYFIELDS={'allow_tags':['b','em','i','strong','span','p','pagebreak'],'safe_attrs':['style'],'style':False}
models.py:
""" A models.py usage example with Additive magic """fromdjango.db.modelsimportModelfromdjango.confimportsettingsfromdjango_tidyfields.fieldsimportTidyTextField,TidyCharFieldclassUserSubmission(Model):title=TidyCharField()description=TidyTextField()body=TidyTextField(field_args=settings.PERMISSIVE_TIDYFIELDS)
5 History
这个模块最初被命名为django bleanfield,并打算成为现在已经失效的django bleanfield模块的精神继承者。一个alpha版本已经上传到pypi,但是它已经被拉到这个模块的支持。在最初的测试中,发现bleach只删除标记,开发人员考虑删除其中的代码是为了使用html而不是安全问题。结果发现,这为一些更有创意的xss过滤器攻击打开了大门。因此,选择lxml替换此模块中的bleach,因为它允许完全删除指定的标记及其内容。
6 Testing
对该模块进行测试,以确保它不会剥离允许的HTML或CSS,但它会剥离XSS攻击或使其保持惰性。测试了来自{a28}的近30次攻击。下一版本将添加更多内容。
免责声明:允许javascript会破坏xss过滤。这样做要极其谨慎,并且只给予受信任的人这样的特权。