首页 > 其他分享 >csrf跨站请求伪造、csrf校验策略、csrf相关装饰器、auth认证模块、auth认证相关模块及操作、扩展auth_user表

csrf跨站请求伪造、csrf校验策略、csrf相关装饰器、auth认证模块、auth认证相关模块及操作、扩展auth_user表

时间:2022-12-30 13:12:03浏览次数:35  
标签:username csrf request 校验 auth user 模块

今日内容

csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户,但是其中有一些猫腻

eg:英语四六级考试需要网上先缴费,但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户,并不是真正的四六级官方账户

模拟钓鱼网站转账案例

真网站:
	<h1>真网站</h1>
<form action="" method="post">
    <p>用户名:
        <input type="text" name="username">
    </p>
    <p>转账人姓名
        <input type="text" name="target_name">
    </p>
    <p>转账金额
        <input type="text" name="money">
    </p>
        <input type="submit">
</form>

假网站:内部隐藏标签
	<form action="http://127.0.0.1:8000/transfer/" method="post">
    <p>用户名:
        <input type="text" name="username">
    </p>
    <p>转账人姓名
        <input type="text" >
        <input type="text" name="target_name" value="日日" style="display: none">
    </p>
    <p>转账金额
        <input type="text" name="money">
    </p>
        <input type="submit">
</form>

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相关装饰器

from django.views.decorators.csrf import csrf_exempt,csrf_protect #导入模块

csrf_exemp		#整个django项目都校验csrf  某个视图函数/类不需要进行csrf校验
csrf_protect	#整个django项目都不校验csrf 某个视图类函数/类需要进行csrf校验

FBV:

#FBV使用直接加就行 与正常函数一直
@csrf_exempt
def index(request):
    pass
"""把csrf_exempt装饰器直接加到index函数中,使该函数不需要经过csrf验证(配置文件开启csrf验证)

CBV:

方式1:单独生效
	from django.utils.decorators import method_decorator #导入模块
    class MyView(views.View):
    @method_decorator(csrf_protect)
    def post(self,request):
        return HttpResponse('from cbv post view')
'''在函数上面添加装饰器 在括号里面填写装饰器的名字 '''


方式2:单独生效
@method_decorator(csrf_protect,name='post')
class MyView(views.View):
    def post(self,request):
        return HttpResponse('from cbv post view')
    
'''在类的上面添加装饰器 括号里写装饰器的名字 和 想要添加装饰器的函数名'''   


方式3:全局有效
	class MyView(views.View):
    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)

    def post(self,request):
        return HttpResponse('from cbv post view')
'''在dispatch方法上面加 修改全局'''

注意:装饰器>>>:csrf_exempt特殊
    只有在dispatch方法上添加 才生效 

auth认证模块

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

创建超级管理员 
createsuperuser

auth认证相关模块及操作

用户注册:

from django.contrib.auth.models import User


def register_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 校验用户名是否已存在
        res = User.objects.filter(username=username)
        if res:
            return HttpResponse('用户名已存在')
        # 注册该用户(不能自己创建 因为密码加密无法实现)
        User.objects.create_user(username=username, password=password)
    return render(request, 'register.html')
'''
注意:创建用户的时候不要再用create方法 用create_user 可以将密码加密
'''

用户登录:

def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #校验用户名和密码是否正确(自己无法比对密码 返回一个用户对象
        res=auth.authenticate(request,username=username,password=password)
        if res :
            #用户登陆成功 返回一个凭证
            auth.login(request,res) #自动操作
            return HttpResponse('登陆成功')
    return render(request,'login.html')

'''
获取到用户名和密码之后要进行比对 
自己无法比对密码 用到auth模块  返回的是一个用户对象 
保存session 用auth模块可以自动操作django_session表
'''

判断用户是否登录:

request.user.is_authenticated

获取登录用户对象数据:

request.uesr

校验用户是否登录装饰器:

from django.contrib.auth.decorators import login_required

@login_required(login_url = '/login/')		局部配置
配置文件 LOGIN_URL = '/login/' 				  全局配置

校验原密码是否正确:

request.user.check_password(原密码)

修改密码:

request.user.set_password(新密码)
request.user.save()

退出登录:

auth.logout(request)
自动操作session

扩展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相关表没有创建

标签:username,csrf,request,校验,auth,user,模块
From: https://www.cnblogs.com/lzy199911/p/17014664.html

相关文章

  • 分布式文件系统 - FastDFS 配置 Nginx 模块及上传测试
    一、安装Nginx和fastdfs-nginx-module安装Nginx请看:​​从零开始学Java-CentOS下安装Nginx​​,其实我只想放这一句话。但想想我还是一步一步写详细吧。1.下载Ngi......
  • Selenium46-添加赛区模块测试准备
    新建第一版测试用例实现代码文件新建包testcasecode新建文件:test_后台_双创_基础设置_赛区管理_添加赛区_case_v1.py导入资源导入各项资源fromselenium.webdriv......
  • 模拟量直流信号隔离放大转换器0-75mV/0-±10V/0-5V转0-±100mV/0-20mA/4-20mAPCB模块
    ​概述:导轨安装DIN11IPOOC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医......
  • Python导入模块的3种方式
    2022-12-30很多初学者经常遇到这样的问题,即自定义 Python 模板后,在其它文件中用import(或from...import)语句引入该文件时,Python解释器同时如下错误:ModuleNotFoundEr......
  • git如何添加子模块
    ①克隆父仓库$gitclonehttps://github.com/a/a.git 本地路径②添加子仓库$gitsubmoduleaddhttps://github.com/a/b.git③push到父仓库$gitadd.$gitcommit-m......
  • git如何删除子模块
    删除子模块:(分4步走)1)$gitrm--cached[path]根据路径删除子模块的记录2)编辑“.gitmodules”文件,将子模块的相关配置节点删除掉清理子模块配置3)编辑“.......
  • docx模块Document报错问题
    报错:fromexceptionsimportPendingDeprecationWarningModuleNotFoundError:Nomodulenamed'exceptions'2、着手解决问题 ......
  • FreeSWITCH给Say模块增加中文语音
    本文更新于2022-04-04,使用FreeSWITCH1.10.7。以下示例,假定源代码目录为/usr/src/freeswitch,安装目录为/usr/local/freeswitch。安装中文Say模块(包括zh和zh_CN的Say接......
  • Kubernetes(k8s) kubectl auth常用命令
    kubectl在$HOME/.kube目录中查找一个名为config的配置文件。可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。本文主要介绍K......
  • 车载模块——毫米波雷达介绍
    1.毫米波雷达的定义毫米波雷达是工作在毫米波频段的雷达,如图2-21所示。毫米波是指长度为1~10mm的电磁波,对应的频率范围为30~300GHz。毫米波雷达是ADAS核心传感器,主要用于自......