Django CSRF跨站请求伪造防护过程解析
作者:Tanglaoer 发布时间:2021-04-15 03:00:50
前言
CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF。
攻击原理
1、用户访问正常的网站A,浏览器就会保存网站A的cookies。
2、用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数。
3、恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时候,浏览器会自动带上网站A的cookies。
4、所以网站A在接收到请求之后,可判断当前用户登录状态,所以根据用户的权限做具体的操作逻辑。
防范措施
1、在指定表单或者请求头的里面添加一个随机值做为参数。
2、在响应的cookie里面也设置该随机值。
3、用户正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验。
4、对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击。
Django中CSRF中间件
django在创建项目的时候,默认就会有添加中间进行CSRF的保护,在MIDDLEWARE可以看到加载了 django.middleware.csrf.CsrfViewMiddleware 的中间件,这里是全局设置,也可以局部设置。
全局保护:直接启用中间件就可以了。
局部保护: from django.views.decorators.csrf import csrf_exempt,csrf_protect
,使用装饰器进行验证。
csrf_protect
:为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件;
csrf_exempt
:取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
验证
在POST请求提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会返回403没有权限访问。
表单验证
在form表单里面需要添加{%csrf_token%},Django会自动渲染隐藏的input输入框:
<input type="hidden" name="csrfmiddlewaretoken" value="2Sb0DQwDVgOQ8i3n1BaG1MUPLEYr6ZGaCLYa14maOQM0Ami5ddQOR6hfXuD2mrmA">
在表单提交的时候,中间件会验证csrfmiddlewaretoken。
通过ajax提交
通过cookies获取到csrftoken,
function getCookie(name) {
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return r ? r[1] : undefined;
}
$.ajax({
url:"/api/v1.0/orders",
type:"POST",
data: JSON.stringify(data),
contentType: "application/json",
dataType: "json",
headers:{
"X-CSRFtoken":getCookie("csrf_token"),
},
局部禁用或者启用
1、如果是函数视图,可以直接在函数加上装饰器即可:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
return HttpResponse('ok')
2、如果是类视图,需要使用方法装饰器进行封装
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.views.generic import TemplateView
@method_decorator(csrf_exempt)
class LoginView(TemplateView):
template_name = 'login.html'
def post():
return HttpResponse('ok')
3、直接装饰as_view()方式,在URLconf里面设置。
from django.views.decorators.csrf import csrf_exempt,csrf_protect
urlpatterns = [
path('login/', csrf_exempt(LoginView.as_view()),name="login"),
]
来源:https://www.cnblogs.com/tangkaishou/p/10284001.html
猜你喜欢
- 本文实例讲述了django框架事务处理。分享给大家供大家参考,具体如下:django 中要求事务处理的情况有两种:1.基于django or
- 目录它有什么作用?安装方法简介它有什么作用?它提供了一种将包括Python对象在内的结构化数据打包为JSON可序列化格式的机制。通过向相应的
- 本文实例为大家分享了python绘制雪花的具体代码,供大家参考,具体内容如下代码非常容易理解,画着玩玩还是可以的。直接上代码# -*- co
- 前言Django提供了多种装饰器, 其中login_required可能是经常会使用到的。 这里介绍下四种使用此装饰器的办法。当然, 在使用
- 生活中,我们在登录微博,邮箱的时候,常常会碰到验证码。在工作时,如果想要爬取一些数据,也会碰到验证码的阻碍。本次试验将带领大家认识验证码的一
- 在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数判断文本
- 本文实例为大家分享了Python人脸识别的具体代码,供大家参考,具体内容如下1.利用opencv库sudo apt-get install
- 1、str.split不支持正则及多个切割符号,不感知空格的数量,比如用空格切割,会出现下面情况。>>> s1="
- Python模块,简单说就是一个.py文件,其中可以包含我们需要的任意Python代码。迄今为止,我们所编写的所有程序都包含在单独的.py文
- 传参时传递可变对象,实际上传的是指向内存地址的指针/引用这个标题是我的结论,也是我在做项目过程查到的。学过C的都知道,函数传参可以传值,也可
- dictPython内置了字典:dict的支持,dict全称dictionary,在其他语言种也称为map,使用键-值(key-value)
- argparse 模块是Python内置的用于命令项选项与参数解析的模块,可以轻松编写友好的命令行接口,能够帮助程序员为模型定义参数。传入一
- 本文实例为大家分享了python使用插值法画出平滑曲线的具体代码,供大家参考,具体内容如下实现所需的库numpy、scipy、matplot
- 用Dreamweaver制作网页时,如果插入的图片、GIF动画、声音、视频或链接的网页是用中文命名的,在用IE浏览器浏览时可能显示不出来。以
- 简单生成器有许多优点。生成器除了能够用更自然的方法表达一类问题的流程之外,还极大地改善了许多效率不足之处。在 Python 中,
- 本文实例讲述了正则表达式匹配ip地址实例。代码结构非常简单易懂。分享给大家供大家参考。主要实现代码如下:import rereip = re
- 一、实验内容 对于下面这幅图像,编程实现染色体计数,并附简要处理流程说明。二、实验步骤1.中值滤波2.图像二值化3.膨胀图像4.腐
- 阅读上一篇:打造设计你自己的字体 ⅠMyFonts.com上销售的字体总数已经超过55,000个。现有字体的巨大数量表明了一个事实:我们在设
- 想要实现自定义标签和过滤器需要进行准备工作:准备(必需)工作:1 在某个app下创建一个名为templatetags(必需,且包
- 一.链接打开方式1、新窗口打开优点:用户点链接的时候,当前浏览的内容不会被替换,不需要通过前进、后退去看自己看过的内容;缺点:访问一会,就会