• Python自动化之Django的CSRF


    什么CSRF?

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

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

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

    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 防护

    form表单

    • 首先,最基本的原则是:GET 请求不要用有副作用。也就是说任何处理 GET 请求的代码对资源的访问都一定要是“只读“的。
    • 要启用 django.middleware.csrf.CsrfViewMiddleware 这个中间件
      再次,在所有的 POST 表单元素时,需要加上一个 {% csrf_token %} tag
    • 在渲染模块时,使用 RequestContext。RequestContext 会处理 csrf_token 这个 tag, 从而自动为表单添加一个名为 csrfmiddlewaretoken 的 input

    ajax做防护

    全局ajax做csrf防护,影响所有ajax。
    ajax是把csrf放在header里 发送到server端

    $(function () {
        $.ajaxSetup({
           beforeSend: function (xhr,settings) {
               xhr.setRequestHeader('X-CSRFtoken',$.cookie('csrftoken'));
           }
        });
    

    官方写法

    var csrftoken = $.cookie('csrftoken');
    function csrfSafeMethod(method) {
      // these HTTP methods do not require CSRF protection
      return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
      beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
      }
    }
    

    什么是xhr?
    XHR = XMLHttpRequest
    XMLHttpRequest 对象用于在后台与服务器交换数据。
    XMLHttpRequest 对象是开发者的梦想,因为您能够:
    在不重新加载页面的情况下更新网页
    在页面已加载后从服务器请求数据
    在页面已加载后从服务器接收数据
    在后台向服务器发送数据
    所有现代的浏览器都支持 XMLHttpRequest 对象。
    jQuery的ajax本质是调用xhr

    全局写法:

    中间件 django.middleware.csrf.CsrfViewMiddleware

    局部写法:

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
    

    tips:查看cookie的csrf的key是什么?

    from django.conf import settings
    print(setting.CSRF_HEADER_NAME)
    结果:HTTP_X_CSRFTOKEN

  • 相关阅读:
    JDK11 | 第七篇 : ZGC 垃圾收集器
    JDK11 | 第六篇 : Epsilon 垃圾收集器
    JDK11 | 第五篇 : 启动单个Java源代码文件的程序
    JDK11 | 第四篇 : 增强API
    JDK11 | 第三篇 : 局部变量类型推断
    JDK11 | 第二篇 : JShell 工具
    JDK11 | 第一篇 : JDK11 介绍
    客户端负载均衡Ribbon之源码解析
    DockerSwarm 微服务部署
    DockerSwarm 集群环境搭建
  • 原文地址:https://www.cnblogs.com/wspblog/p/6266880.html
Copyright © 2020-2023  润新知