Django --- csrf相关,auth相关
1.csrf相关
1.跨站请求伪造
跨站请求伪造:当用户访问一个网站的时候,搭建一个与用户想要访问的网站一摸一样的网站,使假网站的提交地址与站网站的一致,这时候用户访问的是假网站,但是操作却是在真网站上进行反馈的,例如银行网站。
原理:后端只能识别post请求,但是不能识别是不是自己网站返回的post请求
注意点:
1.真假网站的页面一致
2.提交请求的form表单中的action指向正确的网页地址,在提交的时候让后端以为是真网页提交过来的数据
3.在假网站中做一些操作,使用户在进行操作的时候默认的是假网站的设置提交的
2.跨站请求伪造问题解决
思路:只处理自己的网站发送过来的POST请求
解决方式:token
1.token
token的特性是,
发送请求的时候:网站返回给用户一个form表单的时候,会自动添加一个token值发送到前端的页面中,这个token值是唯一的,
提交信息的时候:当用户将信息完善之后再进行提交的时候,中间件会自动校验是不是之前发送过去的token的值,如果是就进行接收,如果不是的话就不进行接收,会提示一个403报错。
当你对这个网站进行重新请求的时候,会重新发送一个token的值,再不同的浏览器上进行操作会产生不同的token值。这样可以确保数据的安全性。
使用方式:
在form表单的第一行写上代码
{% csrf_token %}
2.ajax提交
ajax提交的时候,也需要进行一个token校验,使用ajax提交的时候要注意如果没有将token值携带,也会发生403报错。以下是三种解决方法:
第一种:
先在页面任意的位置上书写{% csrf_token %}
然后在发送ajax请求的时候 通过标签查找获取随机字符串添加到data自定义对象即可
data:{'username':'jason','csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},
第二种:
data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
第三种:(通用,也适合前后端分离)
利用之前写好的脚本文件
1.新建一个js文件放在static文件夹下,
2.将js文件导入,就可以了,不需要写任何csrf相关代码
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
3.crsf中间件
在提交post请求的时候,如果没有设置csrf_token,是不能通过中间件的,
解决方法:
1.注释中间件
'django.middleware.csrf.CsrfViewMiddleware',
2.设置crsf
{% csrf_token %}
4.csrf装饰FBV的装饰器
在执行post请求的时候,如果不想某个视图函数不执行crsf中间件校验的话,可以使用crsf装饰器进行装饰
导入
from django.views.decorators.csrf import csrf_exempt,csrf_protect
不校验csrf
@csrf_exempt # 在进行post请求的时候不进行校验
校验csrf
@csrf_protect # 在进行post请求的时候校验
对那一个视图函数进行装饰,该视图函数多对应的html页面在进行post请求访问的时候就会执行装饰的操作。
对于提交的get请求进行访问是不会进行csrf校验的。
5.csrf装饰CBV的装饰器
csrf_exempt 装饰CBV的方法
from django.utils.decorators import method_decorator # 导入
from django.views.decorators.csrf import csrf_exempt,csrf_protect
方法一:
@method_decorator(csrf_exempt,name='dispatch')
class MyIndex(views.View):
方法二:
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
csrf_exempt这个装饰器只能给dispatch装才能生效
csrf_exem 装饰CBV的方法
csrf_protect方式全都可以 跟你普通的装饰器装饰CBV一致
from django.utils.decorators import method_decorator # 导入
from django.views.decorators.csrf import csrf_exempt,csrf_protect
方法一:
@method_decorator(csrf_protect,name='post') # 可以
class MyIndex(views.View):
方法二:
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
方法三:
@method_decorator(csrf_protect) # 可以
def post(self,request):
6.django settings源码刨析
django有两个配置文件:
一个是暴漏给用户可以配置的,一个是内部全局的(用户配置了就使用用户的,用户没有配置就使用默认的
先加载全局配置,给对象设置属性,
再加载局部配置,再给对象设置,
一旦有重复的项,后者覆盖前者
2.auth模块
1.创建超级用户
方式一:
1.运行tools >>> Run manage.py Task
2.输入:createsuperuser
3.邮箱可以不用输入
4.输入密码,确认密码,最少为8位
注意:创建的超级用户账户会自动添加在auth_user表中,密码会自动使用sha256进行加密
方式二:
from django.contrib.auth.models import User
User.objects.create_superuser(username=username,password=password,email=123@qq.con)
2.创建用户
from django.contrib.auth.models import User # 导入
User.objects.create_user(username=username,password=password)
注意:auth_user中不能存在同名的用户,密码自动加密
3.校验用户名和密码是否正确
from django.contrib import auth
user_obj = auth.authenticate(request,username=username,password=password) # 返回是一个对象
注意:如果用户不存在或者密码错误,会返回一个None,用户名和密码都要输入
4.保存用户登录状态
from django.contrib import auth
auth.login(request,user_obj)
只有保存了用户状态才会产生session
注意:只要执行了保存用户登陆状态,之后在任意位置,只要你能拿到request,你就可以通过request.user获取当前登录的用户对象
5.判断当前用户是否登录
request.user.is_authenticated() # 返回True或False
6.校验原密码是否正确
request.user.check_password(old_password) # 返回True或False
7.修改密码
request.user.set_password(new_password)
request.user.save() # 一定要保存
8.注销
auth.logout(request)
9.校验用户登录的登录装饰器
from django.contrib.auth.decoratros import login_required
局部配置:
@login_required(login_url='/login/')
def index(request):
pass
全局配置
1.在settings中配置文件: LOGIN_URL='/login/'
@login_required
def index(request):
pass
如果全局配置了,局部也配置了,以局部为准
10.auth扩展表
方式一
利用一对一外键字段关系
class UserDetail(models.Model):
phone = models.BigIntegerField()
user = models.OneToOneField(to='User')
方式二
利用继承关系
from django.contrib.auth.models import AbstractUser
class Userinfo(AbstractUser):
phone = models.BigIntegerField()
register_time = models.DateField(auto_now_add=True)
# 一定要注意 还需要去配置文件中配置
AUTH_USER_MODEL = 'app01.Userinfo' # 应用名.表名
# 写完之后 之前所有的auth模块功能全都以你写的表为准,可以继续使用
Django --- csrf相关,auth相关的更多相关文章
- 1205 CSRF跨站请求与django中的auth模块使用
目录 今日内容 昨日回顾 基于配置文件的编程思想 importlib模块 简单代码实现 跨站请求伪造csrf 1. 钓鱼网站 如何实现 模拟该现象的产生 2. 解决问题 解决 {% csrf_toke ...
- django 之csrf、auth模块及settings源码、插拔式设计
目录 基于django中间件拷贝思想 跨站请求伪造简介 跨站请求伪造解决思路 方式1:form表单发post请求解决方法 方式2:ajax发post请求解决方法 csrf相关的两个装饰器 csrf装饰 ...
- 黑马lavarel教程---4、csrf验证及相关
黑马lavarel教程---4.csrf验证及相关 一.总结 一句话总结: csrf验证就像短信验证码那样验证用户身份,这个验证是为了验证是本站的操作,用的是一个token字符串,外站如果有了这个to ...
- Django框架04 /模板相关、别名/反向解析/路由分发
Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...
- Django框架03 /视图相关
Django框架03 /视图相关 目录 Django框架03 /视图相关 1. 请求相关 2.响应相关 3.FBV和CBV 视图(视图函数和视图类) 3.1 类视图 CBV 3.2 视图函数 FBV ...
- CSRF与auth模块
目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...
- (day59)十一、CSRF、Auth模块、impotlib模块、settings源码
目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...
- Django CBV加装饰器、Django中间件、auth模块
一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...
- django csrf 处理简介
CSRF 是什么 CSRF 即跨站请求伪造,在用户不知情的情况下向有漏洞的网站发送请求.例如有正常网站A,恶意网站B, 用户若对A B 两个网站都有访问,B 可能伪造请求到 A,比如提交表单.至于具体 ...
随机推荐
- 15 Filter过滤器和Listener监听器
1.Filter:过滤器 (1) 概念:生活中的过滤器:净水器,空气净化器,土匪.web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.过滤器的作用:一般用于完成通用的 ...
- 【C#】上机实验五
.设计一个控制台应用程序,定义一个MyPoint类,该类能表示二维平面空间的点,完成点类及运算符重载等相关功能.具体要求如下: ()MyPoint类中定义2个私有字段x和y及相应的构造函数. ()My ...
- 在jenkins中使用shell命令推送当前主机上的docker镜像到远程的Harbor私有仓库
1.jenkins主机上的docker配置 先在Jenkins主机的docke上配置上Harbor私有仓库地址 cat /etc/docker/daemon.json { "insecure ...
- 系统开启UAC情形下开机自启动程序如何以管理员权限启动
系统开启UAC情形下开机自启动程序如何以管理员权限启动 题记:本文阐述的是在Windows系统开启UAC的情况下,开机自启动程序需要以管理员权限启动, 系统弹出UAC对话框,用户同意的情形下启动程序 ...
- Java JDK1.8源码学习之路 2 String
写在最前 String 作为我们最常使用的一个Java类,注意,它是一个引用类型,不是基本类型,并且是一个不可变对象,一旦定义 不再改变 经常会定义一段代码: String temp = " ...
- Java开发环境搭建(一)
一.JDK与JRE JDK:Java Development Kit,Java开发工具包,是给开发人员使用的,其中包含了Java的开发工具,如java.javac.jar等命令,同时也包含了JRE. ...
- Synopsys DC综合脚本示例
#****************************************************************************** # File : syn_example ...
- Jmeter学习笔记(十一)——定时器
默认情况下,Jmeter线程在发送请求之间没有间歇.不设置定时器,短时间内会产生大量访问请求,导致服务器被请求淹没,利用Jmeter进行压测时,一般会和定时器一起,控制请求的吞吐量和并发数. 一.定时 ...
- 朴素贝叶斯算法源码分析及代码实战【python sklearn/spark ML】
一.简介 贝叶斯定理是关于随机事件A和事件B的条件概率的一个定理.通常在事件A发生的前提下事件B发生的概率,与在事件B发生的前提下事件A发生的概率是不一致的.然而,这两者之间有确定的关系,贝叶斯定理就 ...
- 部署python项目到linux服务器
最近用Python写了个外挂,需要部署到Linux环境的服务器上,由于之前本地开发时使用virtualenv,使用这个虚拟环境有个好处是项目中依赖的库不会是全局的,只在当前项目的目录下有效,因为我是M ...