Django 1.6.6 版本发行说明

2014 年 8 月 20 日

Django 1.6.6 修复了 1.6.5 中的几个安全问题和错误。

reverse() 可能生成指向其他主机的 URL

在某些情况下,URL 反转可能生成方案相对的 URL(以两个斜杠开头的 URL),这可能会使用户意外地被重定向到另一个主机。攻击者可以利用这一点,例如,通过将用户重定向到一个专门设计用来索取用户密码的钓鱼网站。

为了解决这个问题,URL 反查现在确保没有 URL 以两个斜杠(//)开头,用其 URL 编码的对应项( %2F )替换第二个斜杠。这种方法确保语义保持不变,同时使 URL 相对于域而不是协议。

文件上传拒绝服务攻击

在此版本之前,在其默认配置下,Django 的文件上传处理在上传重复文件名时可能会退化为产生大量的 os.stat() 系统调用。由于 stat() 可能会引发 IO 操作,这可能会导致数据相关的巨大性能下降,随着时间的推移逐渐恶化。最终结果是,给定足够的时间,具有上传文件权限的用户可以通过上传 0 字节文件来导致上传处理程序性能下降,最终导致它变得非常慢。在这一点上,即使是较慢的网络连接和少量的 HTTP 请求也足以使站点不可用。

我们通过更改生成文件名的算法来解决了这个问题,如果已经存在具有上传名称的文件,那么 Storage.get_available_name() 现在会附加一个下划线和一个随机的 7 位字母数字字符串(例如 "_x3a1gho"),而不是通过迭代下划线后面跟着一个数字(例如 "_1""_2" 等)。

RemoteUserMiddleware 会话劫持

在使用 RemoteUserMiddlewareRemoteUserBackend 时,在没有中断注销的情况下,在请求之间更改 REMOTE_USER 标头可能会导致后续用户接管之前用户的会话。现在,在登录尝试失败时,中间件会注销用户。

通过查询字符串操纵在 contrib.admin 中的数据泄露

在较早的 Django 版本中,可以通过修改查询字符串上的 "popup" 和 "to_field" 参数来显示任何字段的数据,这可以在管理界面的更改表单页面上完成。例如,请求类似于 /admin/auth/user/?_popup=1&t=password 的 URL 并查看页面的 HTML 允许查看每个用户的密码哈希。尽管管理员要求用户首先具有查看更改表单页面的权限,但如果您依赖用户只能访问模型上的某些字段,这可能会泄露数据。

为了解决这个问题,现在如果指定了一个不是与已在管理员中注册的模型相关的字段的 to_field 值,将引发异常。

漏洞修复

  • 修正了电子邮件和 URL 验证,以拒绝结尾的连字符(#22579)。
  • 阻止在 PostgreSQL 虚拟字段上创建索引(#22514)。
  • 防止在创建内联模型表单集时出现一个边缘情况,该情况下,FK 字段的值可能会被初始化为错误的值,当关系定义为指向非 PK 字段时(#13794)。
  • 恢复了 GenericRelation 级联删除的 pre_delete 信号(#22998)。
  • 在指定非默认数据库时修复了在 createcachetableflush 中的事务处理(#23089)。
  • 修复了在使用 Unicode 与旧版本的 Oracle 服务器时出现的 "ORA-01843: not a valid month" 错误(#20292)。
  • 恢复了在 Python 2.6.5 及以下版本中发送 Unicode 电子邮件的错误修复(#19107)。
  • 防止了在非 UTF-8 和非英语区域设置中的 runserver 中发生 UnicodeDecodeError#23265)。
  • 修复了在 OpenLayers 小部件中编辑多几何对象时出现的 JavaScript 错误(#23137, #23293)。
  • 防止了在 Python 3 中出现包含未编码的非 ASCII 字符的查询字符串时的崩溃(#22996)。
Back to Top