zoukankan      html  css  js  c++  java
  • Django --- csrf相关,auth相关

    1.csrf相关

    1.跨站请求伪造

    跨站请求伪造:当用户访问一个网站的时候,搭建一个与用户想要访问的网站一摸一样的网站,使假网站的提交地址与站网站的一致,这时候用户访问的是假网站,但是操作却是在真网站上进行反馈的,例如银行网站。

    原理:后端只能识别post请求,但是不能识别是不是自己网站返回的post请求

    注意点:

    1.真假网站的页面一致

    2.提交请求的form表单中的action指向正确的网页地址,在提交的时候让后端以为是真网页提交过来的数据

    3.在假网站中做一些操作,使用户在进行操作的时候默认的是假网站的设置提交的

    2.跨站请求伪造问题解决

    思路:只处理自己的网站发送过来的POST请求

    解决方式:token

    1.token

    token的特性是,

    发送请求的时候:网站返回给用户一个form表单的时候,会自动添加一个token值发送到前端的页面中,这个token值是唯一的,

    提交信息的时候:当用户将信息完善之后再进行提交的时候,中间件会自动校验是不是之前发送过去的token的值,如果是就进行接收,如果不是的话就不进行接收,会提示一个403报错。

    当你对这个网站进行重新请求的时候,会重新发送一个token的值,再不同的浏览器上进行操作会产生不同的token值。这样可以确保数据的安全性。

    使用方式:

    在form表单的第一行写上代码

    {% csrf_token %}
    

    2.ajax提交

    ajax提交的时候,也需要进行一个token校验,使用ajax提交的时候要注意如果没有将token值携带,也会发生403报错。以下是三种解决方法:

    第一种:

    先在页面任意的位置上书写{% csrf_token %}
    然后在发送ajax请求的时候 通过标签查找获取随机字符串添加到data自定义对象即可

    data:{'username':'jason','csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},
    

    第二种:

    data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},		
    

    第三种:(通用,也适合前后端分离)

    利用之前写好的脚本文件

    1.新建一个js文件放在static文件夹下,

    2.将js文件导入,就可以了,不需要写任何csrf相关代码

    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);
        }
      }
    });
    

    3.crsf中间件

    在提交post请求的时候,如果没有设置csrf_token,是不能通过中间件的,

    解决方法:

    1.注释中间件

    'django.middleware.csrf.CsrfViewMiddleware',
    

    2.设置crsf

    {% csrf_token %}
    

    4.csrf装饰FBV的装饰器

    在执行post请求的时候,如果不想某个视图函数不执行crsf中间件校验的话,可以使用crsf装饰器进行装饰

    导入

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

    不校验csrf

    @csrf_exempt  # 在进行post请求的时候不进行校验
    

    校验csrf

    @csrf_protect  # 在进行post请求的时候校验
    

    对那一个视图函数进行装饰,该视图函数多对应的html页面在进行post请求访问的时候就会执行装饰的操作。

    对于提交的get请求进行访问是不会进行csrf校验的。

    5.csrf装饰CBV的装饰器

    csrf_exempt 装饰CBV的方法

    from django.utils.decorators import method_decorator    # 导入
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    
    方法一:
    @method_decorator(csrf_exempt,name='dispatch')
    class MyIndex(views.View):
       
    方法二:
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
       return super().dispatch(request,*args,**kwargs)
    

    csrf_exempt这个装饰器只能给dispatch装才能生效

    csrf_exem 装饰CBV的方法

    csrf_protect方式全都可以 跟你普通的装饰器装饰CBV一致

    from django.utils.decorators import method_decorator    # 导入
    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    
    方法一:
    @method_decorator(csrf_protect,name='post')  # 可以
    class MyIndex(views.View):
            
    方法二:
    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
    	return super().dispatch(request,*args,**kwargs)
    
    方法三:
    @method_decorator(csrf_protect)  # 可以
    def post(self,request):
    

    6.django settings源码刨析

    django有两个配置文件:

    一个是暴漏给用户可以配置的,一个是内部全局的(用户配置了就使用用户的,用户没有配置就使用默认的

    先加载全局配置,给对象设置属性,

    再加载局部配置,再给对象设置,

    一旦有重复的项,后者覆盖前者

    2.auth模块

    1.创建超级用户

    方式一:

    1.运行tools >>>  Run manage.py Task
    2.输入:createsuperuser
    3.邮箱可以不用输入
    4.输入密码,确认密码,最少为8位
    

    注意:创建的超级用户账户会自动添加在auth_user表中,密码会自动使用sha256进行加密

    方式二:

    from django.contrib.auth.models import User
    
    User.objects.create_superuser(username=username,password=password,email=123@qq.con)
    

    2.创建用户

    from django.contrib.auth.models import User  # 导入
    
    User.objects.create_user(username=username,password=password)
    

    注意:auth_user中不能存在同名的用户,密码自动加密

    3.校验用户名和密码是否正确

    from django.contrib import auth
    
    user_obj = auth.authenticate(request,username=username,password=password)  # 返回是一个对象
    

    注意:如果用户不存在或者密码错误,会返回一个None,用户名和密码都要输入

    4.保存用户登录状态

    from django.contrib import auth
    
    auth.login(request,user_obj)
    只有保存了用户状态才会产生session
    

    注意:只要执行了保存用户登陆状态,之后在任意位置,只要你能拿到request,你就可以通过request.user获取当前登录的用户对象

    5.判断当前用户是否登录

    request.user.is_authenticated()     # 返回True或False
    

    6.校验原密码是否正确

    request.user.check_password(old_password)   # 返回True或False
    

    7.修改密码

    request.user.set_password(new_password)
    
    request.user.save()    # 一定要保存
    

    8.注销

    auth.logout(request)
    

    9.校验用户登录的登录装饰器

    from django.contrib.auth.decoratros import login_required
    
    局部配置:
    @login_required(login_url='/login/')
    def index(request):
        pass
    
    全局配置
    1.在settings中配置文件: LOGIN_URL='/login/'
    @login_required
    def index(request):
        pass
    

    如果全局配置了,局部也配置了,以局部为准

    10.auth扩展表

    方式一

    利用一对一外键字段关系
    class UserDetail(models.Model):
    	phone = models.BigIntegerField()
    	user = models.OneToOneField(to='User')
    

    方式二

    利用继承关系  
    from django.contrib.auth.models import AbstractUser
    class Userinfo(AbstractUser):
        phone = models.BigIntegerField()
    	register_time = models.DateField(auto_now_add=True)
    				
    	# 一定要注意 还需要去配置文件中配置
    	AUTH_USER_MODEL = 'app01.Userinfo'  # 应用名.表名
    	# 写完之后 之前所有的auth模块功能全都以你写的表为准,可以继续使用 
    
  • 相关阅读:
    洛谷 1842 [USACO05NOV]奶牛玩杂技【贪心】
    洛谷 1757 通天之分组背包【分组背包】
    洛谷 1330 封锁阳光大学
    洛谷 1019 单词接龙
    【模板】CDQ分治
    BZOJ 2734 洛谷 3226 [HNOI2012]集合选数【状压DP】【思维题】
    BZOJ 2457 [BeiJing2011]双端队列
    洛谷 2015 二叉苹果树
    牛客网 牛可乐发红包脱单ACM赛 C题 区区区间间间
    牛客网 牛可乐发红包脱单ACM赛 B题 小a的旅行计划
  • 原文地址:https://www.cnblogs.com/whkzm/p/11992946.html
Copyright © 2011-2022 走看看