csrf跨站请求伪造

钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻
eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但是却交到了一个莫名其妙的账户 并不是真正的四六级官方账户 # 针对上述情况,它是怎么做到的
# 内部本质
在钓鱼网站上的form表单中,它是写一个没有name属性的input框,它在这个input框下面,在隐藏一个input框,这个隐藏的input框,我给他提前写好name属性和value值,但是用户不知道 # 如何规避上述问题?
在正规网站中给form表单一个唯一标识,然后,表单每次提交的时候,后端都做一个验证 如果正确就可以提交,如果不正确,就直接403(forbidden)

csrf校验策略

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

1.form表单csrf策略
form表单内部添加 {% csrf_token %}
2.ajax请求csrf策略
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
// 方式1 自己手动取值 较为繁琐
{#data:{'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
// 方式2 利用模版语法自动获取 模版语法一定要引号引起来
{#data:{'csrfmiddlewaretoken':'{{ csrf_token }}'},#}
// 方式3 直接引入一个js脚本即可(官网提供的)
data:{},
success:function (args) {
console.log(args)
}
})
})

csrf相关装饰器

整个django项目都校验csrf 但是某些个视图函数\类不需要校验 @csrf_exempt
整个django项目都不校验csrf 但是某些个视图函数\类需要校验 @csrf_protect FBV添加装饰器的方式(与正常函数添加装饰器一致)
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# @csrf_exempt
@csrf_protect
def transfer_func(request):
pass CBV添加装饰器的方式(与正常情况不一样 需要注意)
主要有三种方式
from django.views import View
from django.utils.decorators import method_decorator
# @method_decorator(csrf_protect,name='post') # 方式2:单独生效 指名道姓具体让哪个方法生效
class MyView(View):
# @method_decorator(csrf_protect) # 方式3:整个类中所有方法都生效
@method_decorator(csrf_exempt) # cstf_exempt只有这种添加方式
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') 注意有一个装饰器是特例只能有一种添加方式>>>: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.用户注册功能
1.1 校验用户名是否存在
res = User.objects.filter(username=username)
if res:
return HttpResponse('用户名已存在')
1.2 注册该用户
# User.objects.create(username=username,password=password) # 明文存储
User.objects.create_user(username=username,password=password) # 密文存储
2.判断用户名和密码是否正确'''auth.authenticate'''
# 校验用户名和密码是否正确 自己无法比对密码 必须使用auth模块提供方法
user_obj = auth.authenticate(request,
username=username,
password=password)
# 用户名和密码正确之后返回的是数据对象 不正确则返回None
if user_obj
# 用户登录成功之后返回给客户端登录的凭证
auth.login(request,user_obj) #自动操作django_session表
"""
当执行完上述的操作之后 我们就可以通过request.user直接获取当前登录的用户对象
request.user 获取当前登录用户对象
request.user.username 获取当前用户的用户名
request.user.password 获取当前用户的密码
request.user.is_authenticated 判断当前用户对象是否已登录 返回True False
"""
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.我们在扩展字段的时候,默认的字段我们不要动,只写我们想要增加的字段
2.如果你扩展了这张表,那么auth_user表就不存在了,有的是你自己新建的这张表
3.新建出来的这张表里面的字段,有之前auth_user表中所有的字段外加你自己添加的字段
4.需要在配置文件中添加一个变量,告诉django我要用现在这张新的表替代原来的auth_user表
AUTH_USER_MODEL = 'app01.UserInfo' '应用名.类名'
5.如果你在扩展的这张表之前已经执行了数据库迁移命令,需要重新换库
6.如果你已经迁移了,还想扩展怎么办?
6.1 换库
6.2 删很应用的migrations文件夹
7.得出结论:在执行迁移命令之前就扩展好
"""

总结auth模块方法

模块导入
from django.contrib import auth # 用户认证 验证用户名和密码是否正确 成功则返回用户对象 不正确则返回None
auth.authenticate(request,username=username,password=password) # 该函数接受一个HttpRequest对象,以及一个经过认证的User对象
# 该函数实现一个用户登录的功能 本质上会在后端为该用户生成相关session数据
auth.login(request,认证成功返回的用户对象)
"""
# 获取当前登录用户对象
request.user
# 获取当前用户的用户名
request.user.username
# 获取当前用户的密码
request.user.password
# 判断当前用户是否登录
request.user.is_authenticated
""" # 当前登录的用户session信息会清楚 没有登录也不会报错
auth.logout(request) # 校验用户是否登录装饰器
from django.contrib.auth.decorators import login_required
@login_required
def func():
pass # 创建普通用户 需提供必要参数(username,password)等
create_user() # 创建超级用户
create_superuser() # 校验密码是否正确
request.user.check_password('密码') # 修改密码
request.user.set_password('密码')
request.user.save()

Django框架——csrf跨站请求伪造、csrf校验、csrf相关装饰器、auth认证、auth认证相关模块及操作的更多相关文章

  1. 12月23日内容总结——csrf跨站请求伪造、校验策略、相关装饰器,auth认证模块及相关操作,拓展auth_user表

    目录 一.csrf跨站请求伪造 概念引入 概念讲解 二.csrf校验策略 概念讲解 form表单操作csrf策略 ajax请求csrf策略 三.csrf相关装饰器 四.auth认证模块 五.auth认 ...

  2. Django框架之跨站请求伪造

    跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在 ...

  3. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

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

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

  5. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  6. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  7. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  8. Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法

    Django框架 目录 Django框架 一.csrf跨站请求伪造 1.简介 2.csrf校验策略 form表单csrf策略 ajax请求csrf策略 3.csrf相关装饰器 FBV添加装饰器方式 C ...

  9. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  10. Django框架(十六)-- 中间件、CSRF跨站请求伪造

    一.什么是中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出 二.中间件的作用 如果你想修改请求,例如被传送到view ...

随机推荐

  1. 制作B站直播简介

    本文只用于个人总结备份,如果对你有帮助就更好了. 准备工作 准备好简介要用的的背景图.头像图,上传到图床生成图片链接. 简介的内容可分为主播简介.直播时间.直播内容.联系方式,内容根据实际需要修改,需 ...

  2. TornadoFx的EventBus使用

    原文地址:TornadoFx中的EventBus使用 | Stars-One的杂货小窝 这里默认各位都清楚EventBus的具体作用,稍微有点短,主要国家没有啥好补充的吧 1.定义事件 //接收事件首 ...

  3. (二)Linux环境的学习环境的搭建

    Xshell的安装和连接 由于我们打算通过Xshell进行命令的输入,就不再进行VMWARE-TOOLS的安装. 我们直接进行安装Xshell 并开始连接我们创建的创建的虚拟机 我们可以通过Xshel ...

  4. Web安全前端基础

    Web安全前端基础 1.Web前端介绍 2.前端代码语言简单学习 一.Web前端介绍 web前端就是前端网络编程,也被认为是用户端编程,是为了网页或者网页应用,而编写HTML,CSS以及JS代码,所以 ...

  5. openssl 版本兼容问题 备忘录

    第三方依赖openssl,但openssl却有版本不同符号不兼容的问题,由于条件限制不得不使用固定版本的openssl,又或者同时有两个第三方依赖不同版本的openssl,只能靠手动,为了备忘. 1. ...

  6. 【Oracle】手动安装和卸载Oracle,这是最全的一篇了!!

    写在前面 之前写过一篇在CentOS 7/8上安装Oracle的文章,按照我写的文章安装成功了,但是卸载Oracle时出现了问题.今天,我就整理一篇手动安装和卸载Oracle的文章吧.全文为实战型内容 ...

  7. Spring Boot 工程开发常见问题解决方案,日常开发全覆盖

    本文是 SpringBoot 开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做.便于大家快速处理实践中经常遇到的小问题,既方便 ...

  8. 镭速Raysync v6.6.8.0版本发布

    最近镭速发布了v6.6.8.0版本,已经发布上线了.主要更新内容有服务器下发任务支持指定客户端,客户端增加日志清理和日志压缩,自动删除源文件保持源目录结构,支持将文件投递给其他成员等功能,详细的更新内 ...

  9. docker安装es-header及相关问题解决

    安装es-header docker pull mobz/elasticsearch-head:5 docker run --restart=always --name elasticsearch-h ...

  10. KingbaseES自动生成列介绍

    在KingbaseES中create table语句支持GENERATED column(生成列). 生成列是一种特别的列类型,它的值基于其他列的值计算得出.因此,生成列之于列,有点像视图之于表的关系 ...