Django 1.2.5 发行说明 — Django 文档
Django 1.2.5 发行说明
欢迎使用 Django 1.2.5!
这是 Django 1.2 系列中的第五个“错误修复”版本,提高了 Django 1.2 代码库的稳定性和性能。
除了四个例外,Django 1.2.5 保持与 Django 1.2.4 的向后兼容性。 它还包含许多修复和其他改进。 Django 1.2.5 是当前使用或针对 Django 1.2 的任何开发或部署的推荐升级。
有关 1.2 分支中的新功能、向后不兼容和已弃用功能的完整详细信息,请参阅 Django 1.2 发行说明 。
向后不兼容的更改
AJAX 请求的 CSRF 异常
Django 包含一个 CSRF 保护机制,它利用插入到传出表单中的令牌。 然后中间件检查表单提交时令牌的存在,并验证它。
在 Django 1.2.5 之前,我们的 CSRF 保护对 AJAX 请求进行了例外处理,其依据如下:
- 许多 AJAX 工具包在使用 XMLHttpRequest 时添加 X-Requested-With 标头。
- 浏览器对 XMLHttpRequest 有严格的同源策略。
- 在浏览器的上下文中,可以添加这种性质的自定义标头的唯一方法是使用 XMLHttpRequest。
因此,为了便于使用,我们没有对基于 X-Requested-With 标头的看似 AJAX 的请求应用 CSRF 检查。 Ruby on Rails Web 框架也有类似的豁免。
最近,Google 的工程师让 Ruby on Rails 开发团队的成员意识到浏览器插件和重定向的组合,这可能允许攻击者在对任何网站的请求时提供自定义 HTTP 标头。 这会使伪造的请求看起来像是 AJAX 请求,从而破坏了信任 AJAX 请求同源性质的 CSRF 保护。
Rails 团队的 Michael Koziarski 引起了我们的注意,我们能够产生一个概念证明,证明 Django 的 CSRF 处理中存在相同的漏洞。
为了解决这个问题,Django 现在将对所有请求应用完整的 CSRF 验证,而不管明显的 AJAX 来源。 这在技术上是向后不兼容的,但在这种情况下,安全风险被判断为超过兼容性问题。
此外,Django 现在将接受自定义 HTTP 标头 X-CSRFTOKEN 以及表单提交本身中的 CSRF 令牌,以便与流行的 JavaScript 工具包一起使用,这些工具包允许将自定义标头插入所有 AJAX 请求。
请参阅 CSRF 文档,例如演示此技术的 jQuery 代码 ,确保您正在查看您的 Django 版本的文档,因为某些旧版本的 Django 所需的确切代码是不同的。
FileField 不再删除文件
在早期的 Django 版本中,当一个包含 FileField 的模型实例被删除时,FileField 也会自行从后端存储中删除文件。 这为几个潜在的严重数据丢失场景打开了大门,包括回滚事务和引用同一文件的不同模型上的字段。 在 Django 1.2.5 中,FileField 永远不会从后端存储中删除文件。 如果您需要清理孤立文件,则需要自己处理(例如,使用自定义管理命令可以手动运行或安排定期运行,例如 cron)。
使用自定义 SQL 加载测试中的初始数据
Django 提供了一个自定义 SQL 钩子,作为一种将手工编写的 SQL 注入数据库同步过程的方法。 此自定义 SQL 的可能用途之一是将数据插入数据库。 如果您的自定义 SQL 包含 INSERT
语句,则每次同步数据库时都会执行这些插入。 这包括运行测试套件时创建的任何测试数据库的同步。
然而,在测试 Django 1.3 的过程中,发现这个功能从来没有像宣传的那样完全有效。 使用不支持事务的数据库后端时,或使用 TransactionTestCase 时,使用自定义 SQL 插入的数据在测试过程中将不可见。
不幸的是,没有办法在不引入向后不兼容的情况下纠正这个问题。 与将 SQL 插入的初始数据保持在不确定状态不同,Django 现在强制执行由自定义 SQL 插入的数据在测试期间 不 可见的策略。
此更改仅影响测试过程。 作为 syncdb
过程的一部分,您仍然可以使用自定义 SQL 将数据加载到生产数据库中。 如果您需要在测试条件下存在数据,则应使用 测试装置 或使用测试用例的 setUp()
方法插入数据。
ModelAdmin.lookup_allowed 签名已更改
Django 1.2.4 引入了一个方法lookup_allowed
在ModelAdmin
, 处理安全问题(变更集 :提交:`[15033] <85207a245bf09fdebe486b4c7bbcb65300f2a693>` )。 尽管此方法从未被记录在案,但似乎有些人已经覆盖了 lookup_allowed
,特别是为了应对该变更集引入的回归。 虽然该方法仍未记录在案且未标记为稳定,但了解此函数的签名已更改可能会有所帮助。