## 11.3 在修改数据的HTTP表单上永远使用CSRF保护


Django内置跨站请求伪造(CSRF),并且我们在Django入门教程的第4部分介绍了它的使用。它使用起来很简单,如果你忘记使用它的话,Django甚至会在开发过程中会抛出一个友好的警告。这是一个重要的安全问题,在这里和我们安全章节里我们建议永远使用Django的CSRF保护功能。

根据我们的经验,唯一整站关闭CSRF保护功能的例子是创建了机器访问借口(APIs)。像django-tastypie和django-rest-framework这样的API框架为你做了这件事请。因为API请求应该在每个请求基础上被签名/认证开始,这两个框架不再像通常那样依赖HTTP cookies进行认证。因此,CSRF并不总是一个当你使用这些框架时存在的问题。

如果你正从零开始写一个接收数据变化的API,是时候去熟悉Django的CSRF文档了,点击以下链接 https://docs.djangoproject.com/en/1.8/ref/csrf/

提示:HTML搜索表单

因为HTML搜索表单不会改变数据,它们使用HTTP的GET方法而且不会触动Django的CSRF的保护。

你应该一律使用Django的CsrfViewMiddleware来保护你的站点而不是手动的通过csrf_protect修改你的视图(views)。为了确保CSRF在jinja2模板(template)中工作,请看15.3部分,‘CSRF和jinja2’。


11.3.1 通过AJAX发送数据

甚至当你通过AJAX发送数据的时候,你也应该使用Django的CSRF保护。不要让你的AJAX视图免去CSRF。

而当通过AJAX发送数据,你需要设置一个HTTP头(header):X-CSRFToken。

Django官方文档包含一段叙述向你展示如何对唯一的POST请求设置HTTP头,结合jQuery 1.5或者更高的跨域检测: https://docs.djangoproject.com/en/1.8/ref/csrf/#ajax

查看我们已完成的例子,第17.6部分如何在实践中使用这个技巧,AJAX和CSRF令牌(AJAX and CSRF Token),在16章,Building REST APIs

推荐阅读:https://docs.djangoproject.com/en/1.8/ref/csrf/