CSRF(Cross-site request forgery)以及django中的处理方法

CSRF(Cross-site request forgery) 中文名是跨站请求伪造。
简单的说是用户访问了安全的网站A(比如支付宝)并登录,之后用户又访问了问题网站B。网站B包含恶意代码,在访问网站B的时候,网站B的网页偷偷的向网站A发起post(get)请求进行转账操作。由于你已经登录过网站A,网站A误以为请求是用户自己发起的安全请求。在操作成功后你的钱啥的也不见了。

当前Django的处理方法:

在用户访问网站时为用户生成一个CSRF防范用的token并将token保存到cookie中。每次用户发起请求时需要将token的值作为表单字段一同提交。服务端对用户提交的token值同cookie中的token进行比较,如果相同则认为安全。

由于浏览器对cookie的访问有严格的限制,问题网站B无法访问到网站A的cookie无法正确的设置token。

6 Comments

  • 2012年07月16号 - 9:36 下午 | Permalink

    不错。学习了!

  • 2012年07月19号 - 6:45 上午 | Permalink

    用这么简洁的文字就能把CSRF说清楚,厉害。

  • 2012年07月19号 - 5:10 下午 | Permalink

    在ajax 使用csrf感觉蛮麻烦的
    这几天整合django + DWZJs(一个jquery UI框架)
    根据官方文档使用js那段代码
    结果chrome下面没有问题
    ie和firefox下cookies值总是为空,老是报403错误
    请教博主,有没有什么解决思路呢?亦或是否遇到过ie下csrf报403错误的问题

  • 2012年07月19号 - 9:14 下午 | Permalink

    应当是django没有设置csrf的cookie。你可以在views前进加ensure_csrf_cookie强制django进行csrf cookie的设置。参考文档 https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/#edge-cases
    不需要用户登陆的请求应当是不存在csrf问题的,所以对非登陆的AJAX请求你可以加个
    https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt
    你在用户的登陆函数前加个ensure_csrf_cookie,确保用户登陆后csrf cookie正确设置,需要登录的ajax请求也就没问题了。

  • 2012年07月19号 - 10:30 下午 | Permalink

    非常感觉回复
    我试试看先

  • donyang
    2012年07月28号 - 1:04 上午 | Permalink

    看完这篇文章让我想起了那句话:大师通常是能把复杂的事情说的简单明了的

  • Comments are closed.