csrf跨站请求伪造;auth模块

csrf跨站请求伪造

针对csrf相关的校验有很多种方式,django只是提供了一些而已

form表单

前提必须是前后端整合,能够使用模板语法

{% csrf_token %}
    当前账户:
    目标账户:
    转账金额:

ajax请求

方式1

页面任意位置先写{% csrf_token %} 之后获取数据

方式2

模板语法直接获取

csrf跨站请求伪造;auth模块

js脚本自动处理

只能适用于ajax提交,form表单还是需要额外指定,直接cv拷贝

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?

            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('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);
    }
  }
});

csrf相关装饰器

csrf_exempt:忽略csrf校验;csrf_protect:开启csrf校验

from django.views.decorators.csrf import csrf_exempt,csrf_protect

针对FBV

@csrf_exempt
@csrf_protect
def login(request):
    return render(request, 'login.html')

针对CBV

from django import views
from django.utils.decorators import method_decorator

@method_decorator(csrf_protect, name='post') # 可以校验
@method_decorator(csrf_exempt, name='post')
class MyView(views.View):
    # @method_decorator(csrf_protect) # 可以校验
    def dispatch(self, request, *args, **kwargs):
        super(MyView, self).dispatch(request, *args, **kwargs)

    # @method_decorator(csrf_protect) # 可以校验
    # @method_decorator(csrf_exempt) # 无效
    def post(self, request):
        return HttpResponse('from MyView post')

csrf_protect:三种CBV添加装饰器的方式都可以

csrf_exempt:只有一种方式可以生效(重写的dispatch方法)

@method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(MyView, self).dispatch(request, *args, **kwargs)

auth模块

概念

auth模块是django提供给你快速完成用户相关功能的模块

django也配套提供了一张’用户表’:执行数据库迁移命令之后默认产生的auth_user

django自带的admin后台管理用户登录参考的就是auth_user表

创建admin后台管理员用户: createsuperuser

自动对用户密码进行加密处理并保存

模块方法

from django.contrib import auth
  • 验证用户名和密码是否正确
auth.authenticate()
  • 保存用户登录状态
auth.login()
def lg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        is_user_obj = auth.authenticate(request, username=username, password=password)
        # res = auth.authenticate(request, username=username, password=password)
        # print(res)  # 校验正确返回的是用户对象,错误返回的是None
        if is_user_obj:
            # 记录用户登录状态
            auth.login(request, is_user_obj)
    return render(request, 'lg.html')
  • 获取当前用户对象
request.user # session删除掉会返回匿名用户
  • 判断当前用户是否登录
request.user.is_authenticated() # 返回布尔值

csrf跨站请求伪造;auth模块
  • 校验登录装饰器
from django.contrib.auth.decorators import login_required
    # 局部配置
    @login_required(login_url='/lg/')
    # 全局配置
    @login_required
    LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置
  • 修改密码
if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 先比对原密码是否正确
        is_right = request.user.check_password(old_password)
        if is_right:
            # 修改密码
            request.user.set_password(new_password) # 临时修改密码
            # 保存数据
            request.user.save() # 修改操作同步到数据库
  • 注销登录
auth.logout(request)
  • 注册用户
from django.contrib.auth.models import User
def register(request):
    # User.objects.create(username='chen', password='111') # 不能使用create,密码不会加密
    # User.objects.create_user(username='jame', password='111')
    User.objects.create_superuser(username='kurry', password='1111', email='111@qq.com')
    return HttpResponse('注册成功')

扩展表字段

方式1

编写一对一表关系(了解)

方式2

类继承(推荐)

from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能冲突!!!

    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

配置文件

AUTH_USER_MODEL = 'app01.Users'

注意

类继承之后,需要重新执行数据库迁移命令,并且库里面是第一次操作才可以

auth模块所有的方法都可以直接在自定义模型类上面使用

自动切换参照表

csrf跨站请求伪造;auth模块

Original: https://www.cnblogs.com/zzs0626/p/16311068.html
Author: 顺溜_7
Title: csrf跨站请求伪造;auth模块

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582430/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • zabbix监控配置

    zabbix监控配置 zabbix监控配置 zabbix通过web界面配置邮件告警 zabbix配置客户端监控 创建主机组 创建监控主机并将主机加入主机组 添加监控项 配置触发器 …

    Linux 2023年6月13日
    092
  • Linux ARM中断后的处理(5)【转】

    1. 中断进入自定义函数 在中断发生后,经历ARM通用的处理阶段,到达irq_handler宏,转入C语言阶段。 //arch/arm/kernel/entry-armv.S/**…

    Linux 2023年6月8日
    080
  • 高等代数:5 矩阵的相抵与相似

    5 矩阵的相抵与相似 1、设S,M是两个集合,则集合 ({(a,b)|a \in S,b \in W}) 称为S与M的 笛卡儿积,记作:(S \times M)。 2、定义1:设S…

    Linux 2023年6月8日
    095
  • Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式; 忽略; 捕捉。 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作…

    Linux 2023年6月14日
    0110
  • 性能测试—实施流程记录

    posted @2022-06-08 17:31 尼古丁·瘾 阅读(26 ) 评论() 编辑 Original: https://www.cnblogs.com/ngd-mzl/p…

    Linux 2023年6月8日
    0110
  • Redis Cluster 介绍与使用

    Redis Cluster 功能特性 Redis 集群是分布式的redis 实现,具有以下特性: 1. 高可用性与可线性扩张到1000个节点 2. 数据自动路由到多个节点 3. 节…

    Linux 2023年5月28日
    096
  • Linux Ubuntu 添加新用户

    1. 了解配置文件 Linux下与用户信息相关的配置文件有 /etc/passwd、 /etc/group、 /etc/shadow等,其权限分别如下: /etc/passwd:保…

    Linux 2023年5月27日
    0123
  • Java引用类型

    1 强引用 当我们使用new创建对象时,被创建的对象就是强引用。只要有强引用,GC 永远不会回收掉该对象。 Map map = new HashMap(); 2 软引用 如果一个对…

    Linux 2023年6月7日
    096
  • 《Redis开发与运维》——(六)Redis复制(脑图)

    posted @2021-01-09 15:05 雪山上的蒲公英 阅读(91 ) 评论() 编辑 / 返回顶部代码 / Original: https://www.cnblogs….

    Linux 2023年5月28日
    064
  • jmeter 安装与环境变量配置

    安装jmeter首先要安装与jmeter版本兼容的JDK,安装完成JDK后才能安装jmeter,JDK可以自行在官网下载或者通过360软件管家进行下载。 1、下载安装JDK 安装完…

    Linux 2023年6月8日
    087
  • MAC安装redis

    一、安装命令使用mac的包管理工具brew一行命令搞定安装。若未安装brew,命令行先输入以下命令安装brew。 /usr/bin/ruby -e “$(curl -f…

    Linux 2023年5月28日
    084
  • ADO.NET学习

    ADO.NET五大常用对象 一,SqlConnection(连接对象) 1,配置文件 2,看个例子吧 二,Command对象 执行查SQL查询方法或者PROC返回一个数据库表格, …

    Linux 2023年6月7日
    074
  • Flink 如何分流数据

    场景 分流方式 如何分流 使用Filter分流 使用Split分流 使用Side Output分流 场景 获取流数据的时候,通常需要根据所需把流拆分出其他多个流,根据不同的流再去作…

    Linux 2023年6月7日
    0122
  • bochs(2.6.11)配置安装

    下载:https://bochs.sourceforge.io/ 建议下载2.6.11,下文一开始安装的2.7,但运行时有无法解决的错误。但是大致安装过程一致。 linux 提前安…

    Linux 2023年5月27日
    0123
  • ssh remote forward 监听 0.0.0.0 端口;How to make SSH remote port forward that listens 0.0.0.0

    今天使用ssh转发内网服务的时候,发现remote forward 转发到远程,监听的端口都是localhost。 之前还没发现这种情况,因为都是在所转发的目的主机使用服务。今天,…

    Linux 2023年5月27日
    097
  • AI芯片的软件挑战

    本文是记录会议【ICPA联盟微课 | 第1期】燧原科技李彬:AI芯片的软件挑战内容。不得不说,什么叫高屋建瓴。 芯片软件的5个衡量指标:算力利用率、开发效率、生态兼容性、可移植性、…

    Linux 2023年6月7日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球