首页 > 其他分享 >csrf跨站请求伪造,csrf相关校验策略, CBV添加装饰器的多种方式,auth认证模块,BBS项目需求分析

csrf跨站请求伪造,csrf相关校验策略, CBV添加装饰器的多种方式,auth认证模块,BBS项目需求分析

时间:2022-12-25 20:13:09浏览次数:31  
标签:跨站 request auth django session user csrf BBS

昨日内容回顾

  • django中间件三个需要了解的方法

    process_view
    	路由匹配成功之后执行视图函数\类之前自动触发
    process_exceptoon
    	视图函数\类执行报错之后自动触发
    process_template_response
    	返回的HttpResponse对象含有render属性并且对应一个方法是自动触发
    
  • 基于django中间件实现功能插拔式设计

    1.importlib
    	通过字符串导入模块
    2.从右开始切割字符串
    	rsplit
    3.反射
    	将模块名看成是对象通过反射获取该模块中某个字符串对应的名字
    4.面向对象的多态性
    
  • cookie与session简介

    cookie
    	保存在客户端与用户状态相关的数据
    session
    	保存在服务端与用户状态相关的数据
    ps:以后我们还会接触到token、jwt等各种技术 目的都只有一个>>>:记录某种状态
    
  • django操作cookie

    HttpResponse对象.set_cookie(key,value)  # 添加cookie信息到对象,再返回对象到前端,浏览器就会帮我们保存这样的KV键值对,每次浏览器向后端发送请求数据的时候,都会把cookie的数据,放在请求头里面!!!注意
    HttpResponse对象.COOKIES.get(key)
    
    
    HttpResponse对象.set_signed_cookie(key,
                            value,
                            salt='加密盐',       # 给value的数据加盐
                            max_age=None,        # 失效时间
                            expires=None         # 失效时间 针对IE浏览器的
                             ...
                                    )
    HttpResponse对象.delete_cookie(key)     # 删除cookie  用户的注销登录会用到!!!
    
    ''' 所谓退出登录本质其实就是:将客户端的标识用户身份的cookie删除!!! '''
    
  • django操作session

    1.默认必须要有django_session表   !!!
    2.django默认的session失效时间14天  !!!
    
    request.session[key] = value       # 设置session
    	1.针对key生成一个加密之后的字符串
    	2.在django_session表中存储加密字符串与加密value数据的记录
    	3.并且将该加密字符串返回给客户端保存
    
    request.session.get(key)          # 获取session
    	1.自动获取客户端携带的加密字符串
    	2.自动去django_session表比对是否有对应记录
    	3.如果有自动获取加密的数据并解密到request.session中
    
    补充知识
    	 # 将所有Session失效日期小于当前日期的数据删除
        request.session.clear_expired()
        # 检查会话session的key在数据库中是否存在
        request.session.exists("session_key")
    

  # 删除当前会话的所有Session数据
  request.session.delete()
  # 删除当前的会话数据并删除会话的Cookie。
  request.session.flush()

  # 设置会话Session和Cookie的超时时间
  request.session.set_expiry(t)
    * 如果t是个整数,session会在多少秒数后失效。
    * 如果t是个datatime日期对象或timedelta时间间隔,session就会在这个时间后失效。
    * 如果t是0,用户关闭浏览器session就会失效。
    * 如果t是None,session会依赖全局session失效策略。

> # 今日内容概要

* csrf跨站请求伪造
* csrf相关校验策略
* CBV添加装饰器的多种方式
* auth认证模块
* BBS项目需求分析

> # 今日内容详细

### csrf跨站请求伪造

```python
钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
  eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户

模拟钓鱼网站案例:转账案例
  内部隐藏标签

思考:如何区分真假网站页面发送的请求

csrf校验策略

在提交数据的位置添加唯一标识 

1.form表单csrf策略
	form表单内部添加 {% csrf_token %}
2.ajax请求csrf策略
	// 方式1:自己动手取值 较为繁琐
   {#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
   // 方式2:利用模板语法自动获取(一定要用引号引起来)
   {#data:{ 'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},#}
   // 方式3:直接引入一个js脚本即可(官网提供的)
 	参考:https://www.cnblogs.com/Dominic-Ji/p/9234099.html

csrf相关装饰器

整个django项目都校验csrf 但是某些个视图函数\类不想校验
整个django项目都不校验csrf 但是某些个视图函数\类需要校验

FBV添加装饰器的方式(与正常函数添加装饰器一致)
from django.views.decorators.csrf import csrf_exempt, csrf_protect
# @csrf_exempt
@csrf_protect
def transfer_func(request):pass

CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
# @method_decorator(csrf_protect, name='post')  # 方式2:单独生效
class MyView(views.View):
    @method_decorator(csrf_protect)  # 方式3:整个类中生效
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    # @method_decorator(csrf_protect)  # 方式1:单独生效
    def post(self, request):
        return HttpResponse('from cbv post view')
  
注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
 	只有在dispatch方法添加才会生效

auth认证模块

前戏:django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
1.创建超级管理员
	python38 manage.py createsuperuser

基于auth_user表编写用户相关的各项功能
	登录、校验用户是否登录、修改密码、注销登录等

auth认证相关模块及操作

from django.contrib import auth
from django.contrib.auth.models import User
1.用户注册功能
    User.objects.create_user(username=username, password=password)
2.判断用户名和密码是否正确
	user_obj = auth.authenticate(request,
                       username=username,
                       password=password)  
3.判断用户是否登录
	request.user.is_authenticated
4.获取登录用户对象数据
	request.user
5.校验用户是否登录装饰器
	from django.contrib.auth.decorators import login_required
    @login_required(login_url='/login/')  局部配置 
    @login_required						全局配置
 	 配置文件中LOGIN_URL = '/login/'
6.校验原密码是否正确
	request.user.check_password(原密码)
7.修改密码
	request.user.set_password(新密码)
 	request.user.save()
8.退出登录
	auth.logout(request)

扩展auth_user表

还想使用auth模块的功能 并且又想扩展auth_user表的字段
思路1:一对一字段关联
思路2:替换auth_user表
	步骤1:模型层编写模型类继承AbstractUser
   		from django.contrib.auth.models import AbstractUser
       class UserInfo(AbstractUser):
        # 填写AbstractUser表中没有的字段
        phone = models.BigIntegerField()
        desc = models.TextField()
 	步骤2:一定要在配置文件中声明替换关系
        AUTH_USER_MODEL = 'app01.UserInfo'
	ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)

作业

1.利用auth模块编写一个网站导航条相关的功能(用自己创建的表)
	也可以直接在图书管理系统中切入用户相关的功能
		导航条右侧 用户没有登录现实 登录 和 注册
       用户登录之后 现实当前用户名及登录之后的一些操作 修改密码 退出登录
2.整理今日内容及博客
3.复习本周内容

标签:跨站,request,auth,django,session,user,csrf,BBS
From: https://www.cnblogs.com/tengyifan888/p/17004497.html

相关文章