Django 1.3.5 release notes

2012年12月10日

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

请注意,此安全版本与以前的版本略有不同。这里讨论的两个问题已在先前的Django的安全更新中处理。在一个案例中,我们收到了持续的问题报告,在另一个案例中,我们选择采取进一步措施收紧Django的代码,以响应从多个来源的潜在问题的独立发现。

Host header poisoning

几个早期的Django安全版本专注于中毒HTTP主机头的问题,导致Django生成指向任意的,可能恶意的域的URL。

为了响应接收到的进一步输入以及上一版本之后的持续问题的报告,我们采取额外的步骤来收紧主机头验证。与其尝试适应HTTP支持的所有功能,Django的主机头验证尝试支持一个更小,但更常见的子集:

  • 主机名必须由字符[A-Za-z0-9]加连字符(' - ')或点('。')组成。
  • 允许IPv4地址和IPv6地址。
  • 端口(如果指定)是数字。

任何与此偏离现在都将被拒绝,从而引发异常django.core.exceptions.SuspiciousOperation

Redirect poisoning

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

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

1. 添加了一个新的效用函数django.utils.http.is_safe_url;此函数接受URL和主机名,并检查URL是相对的,或者如果绝对匹配提供的主机名。此功能适用于接受用户提供的重定向目标时使用,以确保此类重定向不会导致任意第三方网站。

2. 所有Django自己的内置视图(主要在身份验证系统中)允许用户提供的重定向目标现在使用is_safe_url验证提供的URL。