Django 1.3.5 发行说明 — Django 文档
Django 1.3.1 版本发行说明
2012 年 12 月 10 日
Django 1.3.5 解决了 1.3 系列之前 Django 版本中存在的两个安全问题。
请注意,此安全版本与以前的版本略有不同。 此处解决的两个问题都已在 Django 的先前安全更新中得到解决。 在一种情况下,我们收到了持续的问题报告,而在另一种情况下,我们选择采取进一步措施来收紧 Django 的代码,以应对从多个来源独立发现的潜在问题。
主机头中毒
几个早期的 Django 安全版本专注于中毒 HTTP Host 标头的问题,导致 Django 生成指向任意、潜在恶意域的 URL。
为了响应收到的进一步输入和上一版本之后持续问题的报告,我们正在采取额外措施来加强主机标头验证。 Django 的 Host 标头验证尝试支持更小但更常见的子集,而不是尝试在此处容纳 HTTP 支持的所有功能:
- 主机名必须由字符
[A-Za-z0-9]
加上连字符 ('-') 或点 ('.') 组成。 - 允许使用 IP 地址(IPv4 和 IPv6)。
- 端口(如果指定)是数字。
现在将拒绝任何偏离,引发异常 django.core.exceptions.SuspiciousOperation。
重定向中毒
还跟进了之前的问题:今年 7 月,我们对 Django 的 HTTP 重定向类进行了更改,对要重定向到的 URL 方案进行了额外的验证(因为,在 Django 自己提供的应用程序和许多第三方应用程序中,接受用户提供的重定向目标是一种常见模式)。
从那以后,对代码的两次独立审计发现了进一步的潜在问题。 因此,类似于 Host-header 问题,我们正在采取措施提供更严格的验证以响应报告的问题(主要是第三方应用程序,但在一定程度上也在 Django 内部)。 这分为两部分:
1. 增加了一个新的效用函数django.utils.http.is_safe_url
; 这个函数接受一个 URL 和一个主机名,并检查 URL 是相对的,还是绝对匹配提供的主机名。 此功能旨在在接受用户提供的重定向目标时使用,以确保此类重定向不会导致任意第三方站点。
2. 所有 Django 自己的内置视图——主要是在身份验证系统中——允许用户提供的重定向目标现在使用 is_safe_url
来验证提供的 URL。