Django 1.1.4 release notes

欢迎来到Django 1.1.4!

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

有一个例外,Django 1.1.4保持与Django 1.1.3的向后兼容性。它还包含一些修复和其他改进。Django 1.1.4是目前使用或定位到Django 1.1的任何开发或部署的推荐升级。

有关新功能,向后兼容性和1.1版本中已弃用的功能的完整详情,请参阅Django 1.1 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,确切的代码是不同的。