csrf 跨站请求伪造相关以及django的中间件
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware来完成。

1.django中常用的中间件?
- process_request
- process_view
- process_response
- process_exception
- process_render_template
2. 使用中间件做过什么?
- 权限
- 用户登录验证
- django的csrf是如何实现?
process_view方法
- 检查视图是否被 @csrf_exempt (免除csrf认证)
- 去请求体或cookie中获取token
3,django中设置防跨站请求伪造功能有分为全局和局部;
3.1,全局设置,但是对某一个函数不进行csrf认证;
settings中设置全局应用;
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
在视图函数中加上装饰器对函数进行去除验证;
from django.views.decorators.csrf import csrf_exempt @csrf_exempt
def users(request):
user_list = ['alex','oldboy']
return HttpResponse(json.dumps((user_list)))
3.2,全局不设置,但是对某一个函数进行csrf认证;
全局中注释掉;
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
视图中加上验证;
from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_protect
def users(request):
user_list = ['alex','oldboy']
return HttpResponse(json.dumps((user_list)))
总结:csrf使用django的中间件来实现,实际上是在process_view方法中实现的,而且是在views函数被执行之前进行的验证;当用户的请求到达视图函数之前会先检查视图函数在以上两种情况下是否需要通过或者免除csrf验证,然后再进行view函数的执行;
1次来访问的时候(get方法),先拿到字符串;下次再来访问的时候(post方法)也必须带着这一串字符串才能成功。
CSRF是指提交数据的时候必须通过验证。
cookie和session是关于用户名/密码保存的。
CSRF字符串不仅在表单里面有了,在cookie里面也有了。
当用form表单提交的时候,把随机字符串和cookie值都发过去了。
如果用Ajax往后台发数据的时候,只需要把cookie值拿到,放到请求头里面发过去就可以了。
加cookie值的Ajax请求过程:
带上随机字符串的话, 才能登录成功。从cookie里面先把随机字符串获取到。获取方法如下:$.cookie('csrftoken'),具体方法如代码所示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login/" method="post">
{% csrf_token %}
<input type="text" name="user" placeholder="user"/>
<input type="password" name="pwd" placeholder="pwd"/>
<input type="checkbox" name="rmb" value="2">10秒免登陆
<input type="submit" value="提交"/>
<input type="button" id="but1" value="按钮"/>
<input type="button" id="but2" value="按钮"/>
</form>
<script src="/static/jquery-1.12.4.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$(function () {
$.ajaxSetup({
beforeSend: function (xhr, settings) {
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
}
}); $('#but1').click(function () {
$.ajax({
url: '/login/',
type: 'POST',
data: {'user': 'root', 'pwd': '123'},
success: function (arg) {
}
})
})
})
</script>
</body>
</html>
不加没有加cookie值的Ajax请求过程:报错通不过CSRF验证,报403错误
但是后台需要通过key去获取这个值,那么这个值对应的key是什么呢?通过打印settings.CSRF_HEADER_NAME可知,
key是HTTP_X_CSRFTOKEN, HTTP_ 是django自动给加上的,所以我们发送的时候,只需要把key设置成 X_CSRFTOKEN就可以了。
由于请求头里面不能出现下划线,所以最终设置的时候应该写成 X-CSRFTOKEN。
理论上我们把请求头设置成X_CSRFTOKEN 就可以了。
但是由于Django有要求,请求头里面不能出现下划线,所以最终我们把请求头设置成X-CSRFTOKEN 的样子。
按照官网推荐,建议写成
X-CSRFtoken。
headers:{'X-CSRFtoken':$.cookie('csrftoken')},
Form表单提交与Ajax方法提交的不同之处在于,去不同的地方拿csrf_token
在 Ajax中写headers太麻烦了,可以用setup 对整个页面中所有的Ajax操作做一个配置。
表示在发送ajax之前,会先执行一下那个函数。
xhr是XMLHttpRequest 对象,所有的ajax操作底层用的都是它。
而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。



1.中间件,在其它程序中,有的叫管道,有的叫http handler。下面是原生的中间件
写中间件,新建文件夹Middle,新建m1.py
在setting里注册中间件,1个类就是1个中间件
做测试,看是否所有的请求过来时,都必须一一经过中间件。(写了一个test函数)
当想拿返回值的时候,可以通过response函数。request里面存放的是客户端的所有数据,可以有request.GET,request.POST,request.method等方法。
通过第一个中间件的时候,就可以判断一下,是否携带了请求头(CSRFtoken),如果没有带请求头的话,在第1步就可以终止了。
完善我们自己写的中间件。其实中间件就是一个普通的类。
整个请求的流程如下:1.10版本,到哪个中间件发生了阻断,就从哪个中间件返回。
注意process_request, process_response 2个函数名是写死的,不能变。
解析process_view函数的意义
def process_view(self,request,view_func,view_func_args,view_func_kwargs):
view_func:指的就是URL中对应的那个函数,在这里指test函数
view_func_args:对应test函数中接收的参数,对应的URL如下:url(r'^test/(\d+)$', views.test), def test(request,nid)
view_func_kwargs:对应test函数中接收的字典,对应的URL如下:url(r'^test/(?P<nid>\d+)$', views.test), def test(request,nid) def process_exception(self,request,exception): 这个函数一般情况下不执行,只有在出错时才执行。指的是异常信息
def process_template_response (self,request,response): 默认情况下也不执行,
如果views中的函数返回的对象中,具有render方法,那这个函数就会执行了。
process_Request, 发出请求
process_view, 通过以后,就会达到view函数
process_response, 开始返回。
csrf 跨站请求伪造相关以及django的中间件的更多相关文章
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- django上课笔记3-ORM补充-CSRF (跨站请求伪造)
一.ORM补充 ORM操作三大难点: 正向操作反向操作连表 其它基本操作(包含F Q extra) 性能相关的操作 class UserInfo(models.Model): uid = models ...
- [Django高级之中间件、csrf跨站请求伪造]
[Django高级之中间件.csrf跨站请求伪造] Django中间件 什么是中间件? Middleware is a framework of hooks into Django's request ...
- Django之CSRF 跨站请求伪造
一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
随机推荐
- [转] 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...
- JavaScript动态加载CSS和JS文件
var dynamicLoading = { css: function(path){ if(!path || path.length === 0){ throw new Error('argumen ...
- python全栈开发day72-django之Form组件
一.ajax 1. 复习JSON 1. JSON是什么? 一种数据格式,和语言无关的数据格式. 2. Python里面转换 1. Python对象 --> 字符串 import json 字符串 ...
- net core体系-3再次认识net core
1 什么是ASP.NET Core ASP.NET Core 是一个全新的开源.跨平台框架,可以用它来构建基于网络连接的现代云应用程序,比如:Web 应用,IoT(Internet Of Things ...
- Python学习(十八)—— 数据库(三)
转载自http://www.cnblogs.com/linhaifeng/articles/7356064.html 一.数据操作 1.插入数据INSERT 1. 插入完整数据(顺序插入) 语法一: ...
- Python 类的内置方法
#!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # p ...
- JAXB在Java 9/10并且使用Tomcat 9的问题
Implementation of JAXB-API has not been found on module path or classpath. JAXB API是java EE 的API,jav ...
- P2661 信息传递 二分图的最小环
题目描述 有 nn 个同学(编号为 11 到 nn )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 ii 的同学的信息传递对象是编号为 T_iTi 的同学. 游戏开 ...
- win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法
win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法 删除这个豆麦笔记 如果之前已经在 控制面板 程序中卸载过,那么是找不到的,我们先运行 slmgr.vbs -xpr,这个时 ...
- Java 之 CSS
1.CSS a.定义:CSS 指层叠样式表 b.意义:为了解决内容与表现分离的问题 c.特点:多个样式可层叠为一 2.用法: a.行内样式:style <span style="col ...