Django学习---CSRF
CSRF
xss攻击:假设我们网站的评论里面允许用户写js的时候,每个人就会看到页面会执行这个js代码,有的是alert,不停的跳出弹框。这个还不算严重的,关键是如果js代码运行的结果不显示在页面上,偷偷的 把cookie发到他自己那去,这样攻击者就可以使用这个cookie登录网站。
CSRF:
1.原理:
发送请求,第一次打开页面是get请求,请求数据,我们不仅把数据发送过去,而且还偷偷的发了一大堆字符串,这个字符串是加密的,只有自己可以反解。
下一次我们提交数据的时候,要带着字符串来,这样才允许提交,不然的话,就报错,不允许提交数据。
这个一般体现在哪呢?
我们用django,如果我们往后台发送post的请求,我们没有把settings那个中间件注释的话,页面就直接出现403错误,比如:
我现在把那个代码的注释去掉:

我们打开我们的login页面,不管写什么点击提交,都会出现403错误:


这个就是做了一层防护,get提交方式没有什么问题,一旦你以post方式提交,后台会先来去你发过来的请求里面去找一下那个随机字符串,这个是CSRF生成的字符串。
那我们应该怎么解决这个问题呢?人家这里需要一个随机字符串,我们传一个就可以了。
在django的内部,也支持生成这个随机的字符串:
在form中我加上这个一个变量:csrf_token:

我们在刷新一下:

就多了一个字符串,这个字符串就是CSRF的token,以后再提交数据的时候就应该带这个字符串。
但是我们这样在这里放一个字符串是没有用的,所以我们要用到下面的东西:


我们在页面上没有看到那个字符串了,但是我们看一下生成的HTML代码:

我们生成了一个隐藏的input,我们在提交数据的时候,后台就能够拿到这个数据了,拿到了就可以通过了。
那如果我们没有这个CSRFtoken,会出现什么效果呢?
假设我们先登录我们自己的网站,登录成功之后 ,我们先放着,我们打开其他的网站,提交表单登录,提交到我们的网站的网址上,如果我们没有这个token的话就直接提交了,但是如果有的话,其他网站的表单不可能有我们自己生成的token,就没有办法进行登录,这样就相当于做了一步防护的工作。
上面是form表单提交数据,我们使用的是csrf_token,那如果是ajax提交我们应该怎么做呢?
我们上面看到了在HTML中生成了一个隐藏的input,里面有一个字符串,其实在我们的cookie中也生成了一个:

我们如果ajax请求,我们只需要拿到这个cookie的值,放到请求头里发过去就行了:
$(function(){
$('#btn').click(function(){
$.ajax({
url : '/login/',
type : 'POST',
data : {'user':'root','passwd':'123'},
headers : {'X-CSRFtoken' : $.cookie('csrftoken')},
success : function (data) {
},
});
});
});
这样就可以提交成功!
当然如果我们下面有很多ajax操作,我们可以在ajaxSetup中添加之后,下面的ajax就不需要了:
<!--在这个里面可以对所有的ajax做一个配置-->
$.ajaxSetup({
beforeSend : function (xhr,settings) {<!--xhr:XMLHttpRequest 的对象,所有的ajax底层操作都是用这个,-->
xhr.setRequestHeader('X-CSRFtoken' , $.cookie('csrftoken'));
}
})
在django中我们还支持:
我们在MIDDLEWARE中把CSRF注释了,每个form提交的时候都要加上一个token,不加就无法进行验证,作用于全部。这个很明显是不合理的,因为有的时候我们说那个函数就不需要加CSRFtoken,会有这种需求。
我们现在有一个需求,100form提交中有2个需要用到CSRFtoken验证,那怎么做呢?
局部:
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
CSRF只有在post提交的时候才起作用,如果用get请求,那不需要csrftoken,那我们可以在上面的ajaxsetup中做判断
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);
}
}
});
Django学习---CSRF的更多相关文章
- django学习之- CSRF及中间件
CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站请求伪造的功能工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端 ...
- Django学习系列之CSRF
Django CSRF 什么是CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到 ...
- Python & Django 学习笔记
最近在学校Python和Django.在学习中遇到了种种的问题,对于一个新手来说,下面的问题可能都会遇到.希望能帮助到那些和我一样的人!!0.python-dev安装(ubuntu) apt-get ...
- python Django 学习笔记(五)—— Django admin自动管理界面
1,激活管理界面 修改settings.py MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.c ...
- Django学习笔记(1)——初识Django
一:Web框架介绍 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以快速帮你开发特定的系统. Web框架是别人已经设定好的一个web网站模板,你学习它 ...
- Django学习笔记(9)—— 开发用户注册与登录系统
一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...
- django学习:一些疑惑
昨天学习了django的第二天,有一些收获. django的语法很严谨,看上去明明对齐的,但是他却提示说缩进不一致.后来我把前面的空全部删除,全部采用空格,这样就通过了,看样子还是要编程有一个好习惯, ...
- 关于Django Ajax CSRF 认证
CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的 ...
- Django学习笔记之Web框架由浅入深和第一个Django实例
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...
随机推荐
- How to input the newline in Numbers of Mac?
newline control+enter
- vue运行原理
Vue工作原理小结 本文能帮你做什么? 1.了解vue的双向数据绑定原理以及核心代码模块 2.缓解好奇心的同时了解如何实现双向绑定 为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简 ...
- vue轮播图
vue开发中遇到这样一个需求实现导航栏和中间内容相结合实现页面滑动导航跟随改变的效果.看效果: 这里我用的是vue所带的插件:vue-awesome-swiper,传送门:https://www.np ...
- test20181223
Written with StackEdit. T1 取石子(stone) Description 有\(n\)堆石子,第\(i\)堆有\(x_i\)个. \(Alice\)和\(Bob\)轮流取石子 ...
- BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur 【tarjan】【DP】*
BZOJ3887 [Usaco2015 Jan] Grass Cownoisseur Description In an effort to better manage the grazing pat ...
- 让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制
各种操作系统的控制台都支持 ANSI 转义序列(ANSI Escape Code).使用转义序列,可以对控制台进行很多额外的定制,例如修改颜色.修改标题栏,将文字添加下划线等. 当然,.NET 已经帮 ...
- Exception.Data 为异常添加更多调试信息
我们抛出异常是为了知道程序中目前的状态发生了错误.为了能够知道错误的详细信息便于我们将来避免产生这样的错误,我们会选用合适的异常类型,在异常中编写易于理解的 message 信息.但是有时我们需要更多 ...
- 轻量级KVO[译]
在这篇文章中,我会实现一个自己用的简单KVO类,我认为KVO非常棒,然而对于我大部分的使用场景来说,有这两个问题: 1. 我不喜欢在observeValueForKeyPath:ofObjec ...
- gprof的使用介绍
转于:http://blog.chinaunix.net/uid-25194149-id-3215487.html #不知道这是在哪里找的了,感谢各位~ 性能分析工具gprof介绍Ver:1.0 目录 ...
- springboot: 使web项目支持jsp
1.springboot为什么不推荐使用jsp? 参考地址:https://spring.io/blog/2012/10/30/spring-mvc-from-jsp-and-tiles-to-thy ...