Django 1.4.14 发行说明 — Django 文档
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
这样的 URL 并查看页面的 HTML 允许查看每个用户的密码哈希。 虽然管理员首先要求用户具有查看更改表单页面的权限,但如果您依赖用户只能查看模型上的某些字段,这可能会泄漏数据。
为了解决此问题,如果指定了与已向管理员注册的模型无关的 to_field
值,则会引发异常。