Django 1.6.6发行说明

2014年8月20日

Django1.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 会话劫持

当使用 RemoteUserMiddleware 以及 RemoteUserBackend ,更改为 REMOTE_USER 请求之间没有中间注销的头可能会导致前一个用户的会话由随后的用户共同选择。中间件现在在登录尝试失败时将用户注销。

通过查询字符串操作的数据泄漏 contrib.admin

在旧版本的django中,可以通过修改管理更改表单页面上查询字符串的“popup”和“to_field”参数来显示任何字段的数据。例如,请求类似 /admin/auth/user/?_popup=1&t=password 并且查看页面的HTML允许查看每个用户的密码哈希。虽然管理员首先要求用户具有查看更改表单页面的权限,但如果您依赖具有访问权限的用户仅查看模型上的某些字段,则可能会泄漏数据。

为了解决这个问题,如果 to_field 指定的值不是已向管理员注册的模型的相关字段。

错误修正

  • 更正电子邮件和URL验证以拒绝尾随的破折号 (#22579

  • 阻止了PostgreSQL虚拟字段上的索引 (#22514

  • 当为定义为指向pk以外的字段的关系创建内联模型表单集时,阻止使用错误值初始化fk字段值的边缘情况 (#13794

  • 恢复 pre_delete 信号用于 GenericRelation 级联删除 (#22998

  • 在中指定非默认数据库时的固定事务处理 createcachetableflush (#23089

  • 修复了将Unicode与旧版本的Oracle Server一起使用时出现的“ora-01843:not a valid month”错误。 (#20292

  • 修复了使用Python2.6.5及更低版本发送Unicode电子邮件的错误 (#19107

  • 预防的 UnicodeDecodeError 在里面 runserver 使用非UTF-8和非英语区域设置 (#23265

  • 修复了在Openlayers小部件中编辑多几何图形对象时出现的javascript错误。 (#23137#23293

  • 防止了使用包含未编码非ASCII字符的查询字符串的python 3崩溃 (#22996