热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CSRF校验策略及装饰器和auth认证模块

目录csrf跨站请求伪造csrf校验策略csrf相关装饰器auth认证模块auth认证相关模块及操作扩展auth_user表csrf跨站请求伪造钓鱼网站:模仿一个正规的网站让用户在

目录



  • csrf跨站请求伪造

  • csrf校验策略

  • csrf相关装饰器

  • auth认证模块

  • auth认证相关模块及操作

  • 扩展auth_user表


csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户,但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费,但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户,并不是真正的四六级官方账户
模拟钓鱼网站案例:转账案例
真实网站:
urls.py
# 转账接口
path('transfer/',views.transfer_func),
views.py:
def transfer_func(request):
if request.method == 'POST':
username=request.POST.get('username')
target_name = request.POST.get('target_name')
mOney= request.POST.get('money')
print(f'{username}给{target_name}转了{money}元')
return render(request,'transferPage.html')
transferPage.html:







我是真的网站

用户名:


他人名:


转账金额:






假网站:
urls.py
# 转账接口
path('transfer/',views.transfer_func),
views.py:
def transfer_func(request):
return render(request,'transferPage.html')







我是假的网站

用户名:


他人名:



转账金额:







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_exempt #整个django项目都校验csrf,某个视图函数\类不需要进行csrf校验
csrf_protect #整个django项目都不校验csrf,某个视图函数\类需要进行csrf校验

FBV:

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

FBV:

#FBV使用直接加就行
@csrf_protect
def index(request):
pass
"""把csrf_protect装饰器直接加到index函数中,使该函数需要经过csrf验证(配置文件关闭csrf验证)
FBV:
方式1:对类中某个方法生效
from django import views
from django.utils.decorators import method_decorator
class MyView(views.View):
@method_decorator(csrf_protect)
def post(self,request):
return HttpResponse('from cvb post view')
#配置文件csrf关闭,类中post方法需要csrf验证
方式2:对类中某个方法生效
from django import views
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect,name='post')
class MyView(views.View):
def post(self,request):
return HttpResponse('from cvb post view')
#配置文件csrf关闭,类中post方法需要csrf验证
方式3:对类中所有方法生效
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django import views
from django.utils.decorators import method_decorator
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 cvb post view')
注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispatch方法添加才会生效,也就是方式3,类所有方法

auth认证模块

前戏:django自带一个admin路由 但是需要我们提供管理员账号和密码
如果想要使用admin后台管理 需要先创建表 然后创建管理员账号
直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表
1.创建超级管理员
python38 manage.py createsuperuser
基于auth_user表编写用户相关的各项功能
登录、校验用户是否登录、修改密码、注销登录等

image


auth认证相关模块及操作

用户注册

urls.py:
# auth用户注册
path('register/',views.register_func),
views.py:
from django.contrib import 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')
# 1.校验用户名是否存在
res = User.objects.filter(username=username)
if res:
return HttpResponse('用户名已存在')
# 2.注册用户
# User.objects.create(username=username,password=password) # create方法不可以使用 密码不加密
User.objects.create_user(username=username,password=password) # create_user方法会自动对密码加密
return render(request,'registerPage.html')
registerPage.html:


{% csrf_token %}

username:


password:






用户登录

urls.py:
# auth用户登录
path('login/',views.login_func),
views.py:
def login_func(request):
print(request.user) # 打印当前登录用户
print(request.user.is_authenticated) # 判断当前用户是否已登录
if request.method == 'POST':
username = request.POST.get('username')
password= request.POST.get('password')
# 1.校验用户名和密码是否正确(不分开校验) 自己无法比对密码 必须要使用auth模块提供的方法才可以
user_obj = auth.authenticate(request,username=username,password=password) # 用户名密码正确之后返回的是数据对象
if user_obj:
# 2.用户登录成功(返回给客户端登录的凭证、令牌、随机字符串)
auth.login(request,user_obj) # 自动操作django_session表
return HttpResponse('登录成功')
'''当执行完上述操作后 我们可以通过request.user直接获取当前登录的用户对象数据'''
return render(request,'loginPage.html')
loginPage.html:


{% csrf_token %}

username:


password:






网站首页

模拟博客园,登录显示用户名,没有登录显示注册和登录

urls.py:
# 网站首页
path('home/',views.home_func),
views.py:
def home_func(request):
return render(request,'homePage.html',locals())
homePage.html:

{% if request.user.is_authenticated %}
{{ request.user.username }}
{% else %}
注册
登录
{% endif %}


校验用户是否登录装饰器

方式1:局部配置
urls.py:
# index页面 只有登录的用户才可以看
path('index/',views.index_func),
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/') #可以明确指定用户没有登录之后跳转到哪个地址
def index_func(request):
return HttpResponse('index页面 只有登录的用户才可以查看')
方式2:全局配置
settings.py:
LOGIN_URL = '/login/'
@login_required
def index_func(request):
return HttpResponse('index页面 只有登录的用户才可以查看')
ps:当局部和全局产生冲突的话,以局部为准

修改密码

urls.py:
# auth用户修改密码
path('set_pwd/',views.set_pwd_func),
views.py:
@login_required
def set_pwd_func(request):
if request.method == 'POST':
old_pwd = request.POST.get('old_pwd')
new_pwd = request.POST.get('new_pwd')
confirm_pwd = request.POST.get('confirm_pwd')
if not new_pwd == confirm_pwd:
return HttpResponse('两次密码不一致')
# 1.判断原密码是否正确
is_right=request.user.check_password(old_pwd)
if not is_right:
return HttpResponse('原密码不正确')
#2.修改密码
request.user.set_password(new_pwd)
request.user.save() # 一定要保存 否则不会修改
return render(request,'setPwdPage.html')
setPwdPage.html:


{% csrf_token %}

原密码:


新密码:


确认密码:






注销登录

urls.py:
# auth用户退出登录
path('logout/',views.logout_func),
views.py:
@login_required
def logout_func(request):
auth.logout(request)
return HttpResponse('用户退出登录')

扩展auth_user表



推荐阅读
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
author-avatar
平凡无琦世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有