Django 的 CSRF 保护机制(转)

时间:2015-01-30 17:36:26   收藏:0   阅读:303

add by zhj:其实我个人推荐前端不要将数据放在cookie中,而是放在其它本地存储(HTML5中称之为Web Storage),本地存储与cookie的一

个重要区别在于:本地数据不会自动加在http请求中。这样也就不会有CSRF了。假设用户登录了网站A,而在网站B中有一个CSRF攻击标签,点

击这个标签就会访问网站A,如果前端数据(包括sessionid)都放在本地存储的话,当在网站B点击CSRF攻击标签时,标签绑定的方法是无法获

取网站A本地存储中的sessionid的,这样用户在服务端无法通过认证,因此也就无法达到CSRF攻击的目的了。这样就可能保证所以请求都是来自

网站A的。

 

原文:http://www.cnblogs.com/lins05/archive/2012/12/02/2797996.html

用 django 有多久,我跟 csrf 这个概念打交道就有久了。

但是一直我都是知其然而不知其所以然,没有把 csrf 的机制弄清楚。昨天稍微研究了一下,总结如下。

什么是 CSRF 

CSRF, Cross Site Request Forgery, 跨站点伪造请求。举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果

某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,

你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。

具体的细节及其危害见 wikipedia

Django 提供的 CSRF 防护机制

django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,

这样就能避免被 CSRF 攻击。

  1. 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
  2. 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
  3. 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.
  4. 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

Django 里如何使用 CSRF 防护

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!