Django 1.2.5 release notes

欢迎来到Django 1.2.5!

这是Django 1.2系列中的第五个“bugfix”版本,提高了Django 1.2代码库的稳定性和性能。

除了四个例外,Django 1.2.5保持与Django 1.2.4的向后兼容性。它还包含一些修复和其他改进。对于目前使用或定位到Django 1.2的任何开发或部署,建议升级Django 1.2.5。

有关新功能,向后兼容性和1.2版本中已弃用的功能的完整详情,请参阅Django 1.2 release notes

Backwards incompatible changes

CSRF exception for AJAX requests

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请求,从而击败CSRF保护,它信任AJAX请求的同源性质。

Rails团队的Michael Koziarski引起了我们的注意,我们能够生成一个概念验证,展示了Django的CSRF处理中的同样的漏洞。

为了解决这个问题,Django现在将对所有请求应用完全CSRF验证,而不考虑明显的AJAX原因。这在技术上是向后不兼容的,但是在这种情况下,安全风险被认为超过了兼容性问题。

此外,Django现在将接受自定义HTTP标头X-CSRFTOKEN中的CSRF令牌,以及表单提交本身,以方便使用流行的JavaScript工具包,这些工具包允许将自定义标头插入到所有AJAX请求中。

请参阅CSRF docs for example jQuery code)演示此技术,确保您正在查看您的Django版本的文档,因为必要的确切代码对于某些旧版本的Django是不同的。

FileField no longer deletes files

在早期的Django版本中,当删除包含FileField的模型实例时,FileField会自动将其从后端存储中删除。这打开了几个潜在严重的数据丢失情况的门,包括回滚事务和引用同一文件的不同模型上的字段。在Django 1.2.5中,FileField永远不会从后端存储中删除文件。如果您需要清除孤立文件,您需要自己处理(例如,使用自定义管理命令,可以手动运行或计划通过例如定期运行。cron)。

Use of custom SQL to load initial data in tests

Django提供了一个自定义SQL钩​​子作为一种将手工制作的SQL注入数据库同步过程的方法。此自定义SQL的一个可能的用途是将数据插入到数据库中。如果您的自定义SQL包含INSERT语句,那么每次数据库同步时都会执行这些插入。这包括在运行测试套件时创建的任何测试数据库的同步。

然而,在测试Django 1.3的过程中,发现这个功能从来没有完全如广告。当使用不支持事务的数据库后端或使用TransactionTestCase时,在测试过程中不会显示使用自定义SQL插入的数据。

不幸的是,没有办法纠正这个问题,而不引入后向不兼容性。与其将插入SQL的初始数据置于不确定状态,Django现在强制执行在测试期间可以看到由自定义SQL插入的数据不能显示的策略。

此更改只影响测试过程。您仍然可以使用自定义SQL作为syncdb进程的一部分将数据加载到生产数据库中。如果需要在测试条件期间存在数据,则应使用test fixtures或使用测试用例的setUp()方法插入数据。

ModelAdmin.lookup_allowed signature changed

Django 1.2.4在ModelAdmin上引入了一个方法lookup_allowed,以应对安全问题(变更集[15033])。虽然这种方法从来没有记录,似乎有些人已经重写lookup_allowed,特别是为了应对由该变更集引入的回归。虽然该方法仍然未被记录并且未被标记为稳定,但是知道该函数的签名已经改变可能是有帮助的。