csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户 模拟钓鱼网站案例:转账案例
内部隐藏标签 思考:如何区分真假网站页面发送的请求

csrf校验策略

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

1.form表单csrf策略
form表单内部添加{% csrf_token %}
2.ajax请求csrf策略
<script src="/static/myjs.js"></script>
<script>
$('#d1').click(function(){
$.ajax({
url:'',
type:'post',
// 方式1:自己动手取值 较为繁琐
{#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
// 方式2:利用模板语法自动获取(一定要引号引起来)
{#data:{'csrfmiddlewaretoken':'{{ csrf_token }}','username':'jason'},#}
// 方式3:引用一个js脚本(官方提供)
data:{},
success:function(args){ }
})
})
</script>
参考: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添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式(这三种方式都在配置里面全局csrf校验开着或者不开的情况下)
from django import views
from django.utils.decorators import method_decorator # @method_decorator(csrf_protect,name='post') # 方式2 单独生效
# @method_decorator(csrf_exempt,name='post') # 方式2 针对csrf_exempt不生效
class MyViews(views.View):
# @method_decorator(csrf_protect) # 方式3 整个类中有效
@method_decorator(csrf_exempt) # 方式3 针对csrf_exempt生效
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs) # @method_decorator(csrf_protect) # 方式1 单独生效
# @method_decorator(csrf_exempt) # 方式1 针对csrf_exempt不生效
def post(self,request):
return HttpResponse('from cbv post view') 注意有一个装饰器是特例只能有一种添加方式>>>:csrf_exempt
只有在dispathch方法添加才会生效

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.用户注册功能
def register_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 1.校验用户是否存在
# res = auth.authenticate(request,username=username,此处缺密码) 必须把密码也传进去
# print(res)
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) # 正常创建 对密码加密
return render(request,'registerPage.html')
2.判断用户名和密码是否正确
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) # 得到用户对象
# print(user_obj.password)
if user_obj:
# 2.用户登录成功(返回给客户端登录成功的凭证、令牌、随机字符串)
auth.login(request,user_obj) # 自己操作django_session表
'''
当执行完上述的操作之后我们就可以通过request.user直接获取到当前登录的用户对象数据
'''
return HttpResponse('登录成功!!!') return render(request,'loginPage.html')
3.判断用户是否登录
request.user.is_authenticated
4.获取登录用户对象数据
request.user
5.校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
# @login_required(login_url='/login/') # 可以明确指定用户没有登录之后跳转到那个地址 局部配置
@login_required # 在settings添加 LOGIN_URL = '/login/' 全局配置
def index_func(request):
return HttpResponse('index页面,只有登录的用户才可以查看')
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相关表没有创建)

python之路56 dajngo最后一天 csrf跨站请求 auth模块登录注册方法的更多相关文章

  1. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

  2. python CSRF跨站请求伪造

    python CSRF跨站请求伪造 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  3. [Django高级之中间件、csrf跨站请求伪造]

    [Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...

  4. Django CBV装饰器 中间件 auth模块 CSRF跨站请求

    CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...

  5. 什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)

    目录 一:csrf跨站请求伪造 1.什么是CSRF? 2.CSRF攻击案例(钓鱼网站) 3.钓鱼网站 内部原理 4.CSRF原理(钓鱼网站内部本质) 5.从上图可以看出,要完成一次CSRF攻击,受害者 ...

  6. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...

  7. Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)

    首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...

  8. ajax向Django前后端提交请求和CSRF跨站请求伪造

    1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...

  9. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  10. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

随机推荐

  1. Java注解(3):一个真实Elasticsearch案例

    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码.变量之类的玩意,这都是一些和生活常识格格不入的东西.只能多用多练,形成肌肉记忆才行. 在一次实际的产品开发中,由于业务需求的缘故,需 ...

  2. Vue ref 和 v-for 结合(ref 源码解析)

    前言 Vue 中组件的使用很方便,而且直接取组件实例的属性方法等也很方便,其中通过 ref 是最普遍的. 平时使用中主要是对一个组件进行单独设置 ref ,但是有些场景下可能是通过给定数据渲染的,这时 ...

  3. nginx+keepalived实现主从模式双机热备份

    主从模式就是一台机器提供服务,另一台机器作为备份机,当主机的服务停止时,备份机立刻接替主机的服务. 安装 安装nginx wget http://nginx.org/download/nginx-1. ...

  4. 华为开发者大会HDC2022:HMS Core 持续创新,与开发者共创美好数智生活

    11月4日,华为开发者大会HDC2022在东莞松山湖拉开帷幕.HMS Core在本次大会上带来了包括音频编辑服务的高拟真歌声合成技术.视频编辑服务的智能提取精彩瞬间功能.3D Engine超大规模数字 ...

  5. Windows骚操作

    电脑常用的快捷键 键盘功能健:Tab.Shift.Ctrl.Alt.Windows.Enter.空格.上下左右健.CapsLock(大小写转换).NumLock(对小键盘控制开/关) 键盘快捷键:全选 ...

  6. 如何把Java代码玩出花?JVM Sandbox入门教程与原理浅谈

    在日常业务代码开发中,我们经常接触到AOP,比如熟知的Spring AOP.我们用它来做业务切面,比如登录校验,日志记录,性能监控,全局过滤器等.但Spring AOP有一个局限性,并不是所有的类都托 ...

  7. vue引用MarkDown(mavonEditor)编辑器,文档

    mavonEditor Install mavon-editor (安装) npm install mavon-editor --save 如何引入: 全局引用: // 全局注册 import Vue ...

  8. 领域驱动设计(DDD)在美团点评业务系统的实践

    前言 至少 30 年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans 将其定义为领域驱动设计(Domain-Driven Design,简称 DDD).在 ...

  9. 基于python的数学建模---蒙特卡洛算法

    import math import random m = input('请输入一个较大的整数') n = 0 for i in range(int(m)): x = random.random() ...

  10. [排序算法] 归并排序 (C++)

    归并排序解释 归并排序 Merge Sort 是典型的分治法的应用,其算法步骤完全遵循分治模式. 分治法思想 分治法 思想: 将原问题分解为几个规模较小但又保持原问题性质的子问题,递归求解这些子问题, ...