Django 1.5.9 release notes

2014年8月20日

Django 1.5.9修复了几个安全问题在1.5.8。

reverse() could generate URLs pointing to other hosts

在某些情况下,URL反转可能会生成方案相对URL(以两个斜杠开头的URL),这可能会意外地将用户重定向到其他主机。例如,攻击者可以通过将用户重定向到设计为要求用户密码的网络钓鱼站点来利用此漏洞。

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

File upload denial-of-service

在此版本之前,当上传重复的文件名时,Django的文件上传处理其默认配置可能会降级到产生大量的os.stat()系统调用。由于stat()可能调用IO,这可能产生巨大的数据相关的减速,随着时间慢慢恶化。最终的结果是,给定足够的时间,具有上传文件能力的用户可能导致上载处理程序的性能较差,最终导致它只是通过上传0字节文件变得非常缓慢。在这一点上,即使一个慢的网络连接和很少的HTTP请求将是使网站不可用所必需的。

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

RemoteUserMiddleware session hijacking

当使用RemoteUserMiddlewareRemoteUserBackend时,对请求之间的REMOTE_USER头的更改无需插入注销可能导致先前用户的会话 - 由后续用户采用。中间件现在会在失败的登录尝试时记录用户。

Data leakage via query string manipulation in contrib.admin

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

为了解决这个问题,如果指定了一个不是与admin注册的模型的相关字段的to_field值,则会出现异常。