Django 1.6.6 发行说明 — Django 文档
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 会话劫持
使用 RemoteUserMiddleware 和 RemoteUserBackend
时,在请求之间更改 REMOTE_USER
标头而无需干预注销可能会导致先前用户的会话被后续用户选择用户。 现在,中间件在登录尝试失败时将用户注销。
contrib.admin 中通过查询字符串操作导致的数据泄露
在旧版本的 Django 中,可以通过修改管理更改表单页面上查询字符串的“popup”和“to_field”参数来显示任何字段的数据。 例如,请求像 /admin/auth/user/?_popup=1&t=password
这样的 URL 并查看页面的 HTML 允许查看每个用户的密码哈希。 虽然管理员首先要求用户具有查看更改表单页面的权限,但如果您依赖用户只能查看模型上的某些字段,这可能会泄漏数据。
为了解决此问题,如果指定了与已向管理员注册的模型无关的 to_field
值,则会引发异常。
错误修正
- 更正了电子邮件和 URL 验证以拒绝尾随破折号 (:ticket:`22579`)。
- PostgreSQL 虚拟字段上的阻止索引 (:ticket:`22514`)。
- 防止边缘情况,当为定义为指向非 PK 字段的关系创建内联模型表单集时,FK 字段的值可能会被初始化为错误的值 (:ticket:`13794`)。
- 为
GenericRelation
级联删除恢复了pre_delete
信号(:ticket:`22998`)。 - 修复了在
createcachetable
和flush
(:ticket:`23089`) 中指定非默认数据库时的事务处理。 - 修复了在旧版 Oracle 服务器 (:ticket:`20292`) 上使用 Unicode 时出现的“ORA-01843: not a valid month”错误。
- 修复了使用 Python 2.6.5 及更低版本 (:ticket:`19107`) 发送 unicode 电子邮件的错误修复。
- 使用非 UTF-8 和非英语语言环境 (:ticket:`23265`) 在
runserver
中阻止UnicodeDecodeError
。 - 修复了在 OpenLayers 小部件中编辑多几何对象时的 JavaScript 错误(:ticket:`23137`, :ticket:`23293`)。
- 使用包含未编码非 ASCII 字符的查询字符串 (:ticket:`22996`) 防止 Python 3 崩溃。