跨站请求伪造(csrf)中间件整理
一. CSRF中间件
字面意思跨站请求伪造; 即模仿个请求朝服务器发送,django中对跨站伪造的请求有相应的校验
from django.views.decorators.csrf import csrf_exempt, csrf_protect
csrf_exempt 给单个视图排除校验,以装饰器形式给某个视图加上,则该视图就不会进行校验
局部禁用的前提是全局有校验
csrf_protect 给单个视图必须校验,以装饰器形式给某个视图加上,则该视图就必须进行校验
即使注释调settings中的46行也必须得校验. 局部使用的前提是全局没有校验
二. csrt源码解析其校验的本质大概流程是:
1. 在process_request内,从请求的cookie中获取csrftoken的值,保存为scrf_token
2. 在process_view内:
> 如果视图函数加上了csrf_exempt的装饰器 不做校验
> 如果请求方式是'GET', 'HEAD', 'OPTIONS', 'TRACE' 也不做校验
> 其它的请求方式就要进行校验了,校验的实质如下:
1.从request.POST中获取csrfmiddlewaretoken对象的值
2.从请求头中获取csrfmiddlewaretoken对象的值
3.用获取到的csrfmiddlewaretoken的值和csrftoken的值做比较,如果校验成功,流程继续;校验不成功
则拒绝; 1和2中只要有1个能获取到csrfmiddlewaretoken的值即可,不用两个中都有.
总结: 两点要求,1.浏览器必须带有cookie; 2. post请求体中或请求头中要能获取到csrfmiddlewaretoken值
三.针对以上总结的两点,做相应的处理,处理办法如下
确保浏览器带有cookie的两种方式:
> 在form表单内加入{% csrf_token %}
> 不使用{% csrf_token %},导入from django.views.decorators.csrf import ensure_csrf_cookie
将ensure_csrf_cookie以装饰器形式加在视图上,保证返回的相应有cookie
确保能从post请求体中或请求头信息中获取到csrfmiddlewaretokende的方式:
> 页面中加入{% csrf_token %}标签
1.获取标签值,加入post请求体中, csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()
2.获取标签值,加入post请求头中, headers: {"X-CSRFToken": $('[name="csrfmiddlewaretoken"]').val()}
> 上面1或2都是给单个的ajax请求加csrfmiddlewaretokende,这里再介绍个通过引入js文件形式
给全局所有ajax头部加入csrfmiddlewaretokende的办法,代码思路如下: (万能办法)
1.通过django官网提供的代码来实现,首先项目下static文件夹内新建js文件,复制以下代码:
2.以script标签在html页面导入新建的这个a.js文件, <script src=’/static/a.js’></script>
它的作用是给每个请求头信息上加crsfmiddlewaretoken信息
猜测: 引入js文件形式可同时让浏览器带cookie和让请求头带crsfmiddlewaretoken信息,因为使用
CBV写ajax文件上传时,html中没加{%csrf_token%},views中也没用ensure_csrf_token装饰器
四. js文件代码如下:
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);
}
}
});
跨站请求伪造(csrf)中间件整理的更多相关文章
- django之跨站请求伪造csrf
目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...
- PHP安全编程:跨站请求伪造CSRF的防御(转)
跨站请求伪造(CSRF)是一种允许攻击者通过受害者发送任意HTTP请求的一类攻击方法.此处所指的受害者是一个不知情的同谋,所有的伪造请求都由他发起,而不是攻击者.这样,很你就很难确定哪些请求是属于跨站 ...
- 跨站请求伪造(CSRF)-简述
跨站请求伪造(CSRF)-简述 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 ...
- 跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险
跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险 跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估 ...
- 跨站请求伪造 CSRF / XSRF<一:介绍>
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一 ...
- 跨站请求伪造CSRF(Cross-site request forgery)
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- 跨站请求伪造(csrf)的防护手段
CSRF CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造. CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求. 造成的问题:个人隐私泄露以及财产安全. CS ...
- 跨站请求伪造CSRF:攻击与防御
CSRF是什么 (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为&quo ...
- 跨站请求伪造CSRF
CSRF是Cross Site Request Forgery的缩写,乍一看和XSS差不多的样子,但是其原理正好相反,XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求. 在XSS危害 ...
随机推荐
- http:origin,referer和host区别
发起一个ajax请求时,request header里面有三个属性会涉及请求源信息.前端可能用不到这些值,但是,后台业务系统会比较关心它们,场景可能有: 处理跨域请求时,必须判断来源请求方是否合法:后 ...
- 同步软件UltraCompare 64位 软件及注册机
软件及注册机下载: https://share.weiyun.com/f09e6243887e374ead1b3a3ab8f611a9 软件官方下载地址: https://www.ultraedit ...
- 【PHP 模板引擎】Prototype 原型版发布!
在文章的开头,首先要向一直关注我的人说声抱歉!因为原本是打算在前端框架5.0发布之后,就立马完成 PHP 模板引擎的初版.但我没能做到,而且一直拖到了15年元旦才完成,有很严重的拖延症我很惭愧,再次抱 ...
- IOS 多线程-NSThread 和线程状态
@interface HMViewController () - (IBAction)btnClick; @end @implementation HMViewController - (void)v ...
- 【洛谷4815】[CCO2014] 狼人游戏(树形DP)
点此看题面 大致题意: 已知有平民和狼人共\(n\)个,每个平民会指控和保护任何人,每个狼人只会指控平民.保护狼人.告诉你\(m\)对指控与保护的关系,求有\(k\)个狼人的方案总数. 树形\(DP\ ...
- LCT入门
前言 \(LCT\),真的是一个无比神奇的数据结构. 它可以动态维护链信息.连通性.边权.子树信息等各种神奇的东西. 而且,它其实并不难理解. 就算理解不了,它简短的代码也很好背. \(LCT\)与实 ...
- windows2003服务器双线双IP双网卡设置方法
双线双ip很好,网通用户访问网通线路,电信用户访问电信线路.但很多人会选用导入静态路由表,这个办法看似完美,其实问题很多. 1.电信用户如果被解析到网通的ip上,服务器根据路由表会返回电信线路,但用户 ...
- 零基础Centos6搭建Git服务器,及常见问题解决
1.编译安装git 2.1 服务器端: #yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl- ...
- Spring boot 集成三种定时任务方式
三种定时任务方式分别为 org.springframework.scheduling.annotation.Scheduled java.util.concurrent.ScheduledExecut ...
- void和void*指针的一些理解
void 和 void* 指针分别表示无类型和无类型指针. void 的作用是限制: 1,函数无返回值. 2,函数无参数. 当函数的返还值无参数的时候一定要加上 void ,因为在缺省的状态下函数的返 ...