Django 1.4.14发行说明

2014年8月20日

Django 1.4.14在1.4.13中修复了几个安全问题。

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/?pop=1&t=password 并且查看页面的HTML允许查看每个用户的密码哈希。虽然管理员首先要求用户具有查看更改表单页面的权限,但如果您依赖具有访问权限的用户仅查看模型上的某些字段,则可能会泄漏数据。

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