CSRF

  • CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。
  • CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。
    • 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
  • 造成的问题:个人隐私泄露以及财产安全。

CSRF攻击示意图

  • 客户端访问服务器时没有同服务器做安全验证

防止CSRF攻击

  • 提示:Django默认开启了CSRF安全验证功能

防止CSRF攻击原理代码演示

  • 准备:正则匹配urls和视图

      # csfr
      url(r'^csrf/$', views.csrf),
      url(r'^csrf1/$', views.csrf1),
    
      # csrf
      def csrf(request):
          return render(request, 'Book/csrf.html')
    
      # 处理POST请求
      def csrf1(request):
          dict = request.POST
          uname = dict.get('uname')
          money = dict.get('money')
    
          # 获取csrf验证码
          token = dict.get('csrfmiddlewaretoken')
    
          str = '%s--%s--%s' % (uname, money, token)
          return HttpResponse(str)
    
  • 无csrftoken的模板代码

  • 无csrftoken的网页源码

  • 无csrftoken的表单提交

  • CSRF验证失败

  • 有csrftoken的模板代码

  • 有csrftoken的网页源码

  • 有csrftoken的表单提交

防止CSRF攻击原理示意图

总结:Django 提供的 CSRF 防护机制

  • 1.Django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。

  • 2.在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token

  • 3.在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 csrf_token标签, django 就会自动帮我们生成)

  • 4.在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提 交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.