Django 1.3.5 版本发行说明

2012 年 12 月 10 日

Django 1.3.5 解决了 1.3 系列中之前 Django 版本存在的两个安全问题。

请注意,这个安全发布与之前的发布略有不同。这里解决的两个问题都已在之前的 Django 安全更新中得到处理。在一个案例中,我们收到了持续的问题报告,另一个案例中,我们选择采取进一步措施来加强 Django 的代码,以应对来自多个来源的潜在问题的独立发现。

Host 头部中毒

早期的几个 Django 安全发布主要关注 HTTP Host 头部被污染的问题,这会导致 Django 生成指向任意、可能恶意的域名的 URL 。

为了回应收到的进一步意见以及在之前发布后持续出现的问题,我们正在采取额外措施来加强 Host 头部验证。与其试图适应 HTTP 支持的所有功能,Django 的 Host 头部验证试图支持一个更小但更常见的子集:

  • 主机名必须由字符 [A-Za-z0-9] 加上连字符(’-‘)或点号(’.’)组成。
  • 允许使用 IP 地址 - 包括 IPv4 和 IPv6 。
  • 如果指定了端口,必须为数字。

现在,任何与此不符的都将被拒绝,并引发异常 django.core.exceptions.SuspiciousOperation

重定向投毒

同样是跟进之前的问题:今年 7 月,我们对 Django 的 HTTP 重定向类进行了修改,对要重定向到的 URL 的方案进行了额外验证(因为在 Django 自带的应用程序和许多第三方应用程序中,接受用户提供的重定向目标是一种常见的模式)。

从那时起,对代码进行的两次独立审计发现了更多潜在问题。因此,与 Host-header 问题类似,我们正在采取措施提供更严格的验证,以应对报告的问题(主要是与第三方应用程序相关,但在一定程度上也涉及 Django 本身)。这分为两部分:

1. A new utility function, django.utils.http.is_safe_url, is added; this function takes a URL and a hostname, and checks that the URL is either relative, or if absolute matches the supplied hostname. This function is intended for use whenever user-supplied redirect targets are accepted, to ensure that such redirects cannot lead to arbitrary third-party sites.

2. All of Django’s own built-in views — primarily in the authentication system — which allow user-supplied redirect targets now use is_safe_url to validate the supplied URL.