Django 2.2.8 版本发行说明

2019 年 12 月 2 日

Django 2.2.8 修复了 Django 2.2.7 中的一个安全问题和若干个错误,并增加了与 Python 3.8 的兼容性。

CVE-2019-19118 : Django admin 中的特权升级漏洞。

自 Django 2.1 起,当 Django 模型管理器显示带有相关模型内联的父模型时,如果用户对父模型具有只读权限但对内联模型具有编辑权限,则会在父模型上显示只读视图,但在内联模型上显示可编辑表单。

提交这些表单将不允许直接编辑父模型,但会触发父模型的 save() 方法,并导致调用预保存和后保存信号处理程序。这是一种特权升级,因为缺少编辑模型权限的用户不应该能够触发与其保存相关的信号。

为解决这个问题,Django 管理界面的权限处理代码已经进行了更改。现在,如果用户只对父模型具有"查看"权限,即使用户对内联模型具有编辑权限,整个显示的表单也将不可编辑。

这是一个不兼容的变更,Django 安全团队意识到一些 Django 用户依赖于在管理界面中允许编辑内联模型,即使父模型本身只有查看权限。

鉴于 Django 管理员的复杂性,尤其是与权限相关的检查,Django 安全团队认为这个改变是必要的:目前不可能在维护现有行为的同时避免潜在的特权升级,这种方式可以避免将来发生类似问题的重复发生,并且与 Django 的“默认安全”的哲学兼容。

暂时来说,受到此变更影响的开发者应该将只读父模型中的内联模型替换为自定义的表单和视图,明确实现所需的功能。从长远来看,Django 可能会在管理界面中添加一个经过文档化、支持和经过适当测试的机制,用于部分可编辑的多模型表单。

漏洞修复

  • 修复了在自定义 formset 的前缀 包含正则表达式特殊字符(例如 '$')时,管理 changelist 视图中的数据丢失可能性的问题 (#31031)。
  • 修复了 Django 2.2.1 中的一个回归问题,如果 default 条目为空,在具有多个数据库设置的情况下,迁移权限时会导致代理模型崩溃 (#31021)。
  • 修复了在 select_for_update() 中的数据丢失可能性。当在 多表继承 中的 of 参数中使用 'self' 时,父模型被锁定,而不是查询集的模型 (#30953)。
Back to Top