Django 的CSRF保护机制
什么是CSRF
CSRF(Cross Site Request Forgery),跨站点请求伪造。也被称为one-click-attack或者session riding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。
Django提供的CSRF防护机制
django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个token,把这个token放在cookie里。然后每次POST请求都会带上这个token,这样就能避免CSRF攻击。
- 在返回的HTTP响应的cookie里,django会为你添加一个csrftoken字段,其值为一个自动生成的token
- 在所有的POST表单时,必须包含一个csrfmiddlewaretoken字段(只需要在模板里加一个tag,django就会自动帮你生成)
- 在处理POST请求之前,django会验证这个请求的cookie里的csrftoken字段的值和提交的表单里的csrfmiddlewaretoken字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能来自别人的csrf攻击,返回403 Forbidden.
- 在所有ajax POST请求里,添加一个X-CSRFTOKEN header,其值为cookie里的csrftoken值
Django里如何使用CSRF防护
- 首先,最基本的原则是: GET请求不要用,有危险性,也就是任何处理GET请求的代码对资源的访问都一定要是”只读”的
- 要启用django.middleware.csrf.CsrfViewMiddleware这个中间件
- 再次,在所有的POST表单元素时,需要加上一个
- 在渲染模块时,使用RequestContext.RequestContext会处理csr_token这个tag,从而自动为表单添加一个名为csrfmiddlewaretoke的input