CSRF 中间件和模板标签提供对跨站请求伪造简单易用的防护。某些恶意网站上包含链接、表单按钮或者JavaScript ,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击。还有另外一种相关的攻击叫做“登录CSRF”,攻击站点触发用户浏览器用其它人的认证信息登录到其它站点。
防护CSRF 攻击的第一道防线是保证GET 请求(以及在9.1.1 Safe Methods, HTTP 1.1, RFC 2616 中定义的其它安全的方法)不会产生副作用。通过例如POST、PUT 和DELETE不安全的请求方法,可以通过以下步骤进行防护。
想在你的视图中使用CSRF 防护,请遵循以下步骤:
CSRF 中间件在MIDDLEWARE_CLASSES 设置中默认启用。如果你要覆盖这个设置,请记住'django.middleware.csrf.CsrfViewMiddleware' 应该位于其它任何假设CSRF 已经处理过的视图中间件之前。
如果你关闭了它,虽然不建议,你可以在你想要保护的视图上使用csrf_protect()(见下文)。
在使用POST 表单的模板中,对于内部的URL请在<form> 元素中使用csrf_token 标签:
<form action="." method="post">它不应该用于目标是外部URL 的POST 表单,因为这将引起CSRF 信息泄露而导致出现漏洞。
在对应的视图函数中,确保使用 'django.template.context_processors.csrf' Context 处理器。通常可以用两种方法实现:
使用RequestContext,它会始终使用'django.template.context_processors.csrf'(无论TEMPLATES 设置中配置的是什么模板上下文处理器)。如果你正在使用通用视图或Contrib 中的应用,你就不用担心了,因为这些应用通篇都使用RequestContext。
手工导入并使用处理器来生成CSRF token,并将它添加到模板上下文中。例如:
from django.shortcuts import render_to_response from django.template.context_processors import csrf def my_view(request): c = {} c.update(csrf(request)) # ... view code here return render_to_response("a_template.html", c)