Django 1.4.4 版本发行说明

2013 年 2 月 19 日

Django 1.4.4 修复了 1.4 系列中之前 Django 版本存在的四个安全问题,以及其他一些错误和大量文档改进。

这是 Django 1.4 系列中的第四个错误修复/安全更新版本。

Host 头部中毒

Django 的某些部分(与最终用户编写的应用程序无关)使用包含域名的完整 URL,这些 URL 是根据 HTTP Host 头生成的。 Django 的文档已经包含了一些关于如何配置 Web 服务器以确保只有有效的 Host 头才能到达 Django 应用程序的建议。然而,有人向我们报告称,即使采用了建议的 Web 服务器配置,仍然有一些方法可以欺骗许多常见的 Web 服务器,使它们向应用程序提供错误且可能恶意的 Host 头。

因此,Django 1.4.4 添加了一个新的设置,名为 ALLOWED_HOSTS,其中包含了此站点的有效主机/域名的明确列表。如果请求的 Host 标头与此列表中的条目不匹配,那么如果调用了 request.get_host(),将引发 SuspiciousOperation。有关详细信息,请参阅 ALLOWED_HOSTS 设置的文档。

Django 1.4.4 中此设置的默认值是 ['*'] (匹配任何主机),出于向后兼容性考虑,但我们强烈建议所有站点设置一个更为限制性的值。

DEBUGTrue 时或在运行测试时,主机验证会被禁用。

XML 反序列化

Python 标准库中的 XML 解析器容易受到外部实体和实体扩展攻击。 Django 使用此解析器对 XML 格式的数据库固件进行反序列化。这个反序列化器并不是为了处理不可信数据而设计的,但为了在 Django 1.4.4 中确保安全,XML 反序列化器拒绝解析带有 DTD(DOCTYPE 定义)的 XML 文档,从而阻止了这些攻击途径。

Python 标准库中的这些问题是 CVE-2013-1664 和 CVE-2013-1665。可以从 Python 安全团队 获取更多信息。

Django 的 XML 序列化器不会创建带有 DTD 的文档,因此这不应该导致从 dumpdataloaddata 的典型往返出现任何问题。但是,如果您向 loaddata 管理命令提供自己的 XML 文档,您需要确保它们不包含 DTD。

表单集内存耗尽

以前的 Django 版本没有验证或限制表单集管理表单中由客户端提供的表单计数数据,这使得通过强制创建大量表单来耗尽服务器可用内存成为可能。

在 Django 1.4.4 中,所有表单集都有一个严格执行的最大表单数限制(默认为 1000,尽管可以通过表单集工厂参数 max_num 设置更高的值)。

管理员历史视图信息泄露

在以前的 Django 版本中,没有模型更改权限的管理员用户仍然可以通过其管理历史记录查看实例的 Unicode 表示。现在,Django 1.4.4 将对象的管理历史记录视图限制为具有该模型更改权限的用户。

其他错误修复和更改

  • 防止事务状态从一个请求泄露到下一个请求( #19707 )。
  • 更改了 SQL 命令语法以实现 MySQL 4 兼容性( #19702 )。
  • 增加了对旧版未加盐 MD5 密码的向后兼容性( #18144 )。
  • 大量文档改进和修复。