使用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+

build-statusRequirements statusCoverage status

python-versionsdjango-versionspypi-versionpypi-downloads

清除来自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 Zorander
Stone 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过滤。这样做要极其谨慎,并且只给予受信任的人这样的特权。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么只为字符数组重载println方法,而不为字符串、整数等其他数组重载?   java将快速线程返回到池中,而不是等待慢速线程   创建jar文件时java SwingWorker不工作   java如何将依赖注入RabbitListener   java如何在gradle任务中通过scp复制目录?   java在MySql数据库中创建表时,遇到NullPointerException   java HTTP Status 500 Servlet执行引发异常   在JAVA中对arraylist使用继承时出错   java PowerMockito未完成存根异常   如果没有错误/警告增加到某个极限,java是否停止在eclipse中构建项目或使用maven?   java Robolectric如何测试DateFormat。getBestDateTimePattern()   google云平台GCP数据存储Java API,构建一个空值实体   VerifyListener和FocusListener之间的java冲突   安卓是否可以在Java中的另一个方法内部强制调用一个方法?   JavaWindows7、JDK1.8、SpringBoot应用程序JAR在方法安全性方面占用了大量时间。getProviders()返回   Bean提供程序的java错误消息   java Slick动画每帧必须有一个持续时间   java无法在Trie中设置isLeaf标志   java为什么JVM不能创建包含main方法的类的对象,以便从该类访问main方法,如果它具有该类的名称?   java Apache Camel+CXF端点身份验证