2024年最全【Django网络安全】如何正确防护CSRF跨站点请求伪造_drf csrf(1),2024年最新真香系列

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

三、Django的CSRF防御解析

django的csrf防御是通过中间价来执行,默认是开启状态。位置是django项目的settings文件。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',  # csrf防御
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'utils.middleware.LogMiddleware.OpLog',  # 访问记录
]

1.CSRF防护的过程

CsrfViewMiddleware中间件使用的情况下,通过中间件的process_request方法获取请求cookie中的csrftoken,通过process_view获取post、put、delete请求cookie中的csrftoken和表单中的csrfmiddlewaretoken并进行校验(不通过就是403),通过process_response设置cookie的csrftoken参数(需要登录)。

2.cookie中的csrftoken

这里我都是用xadmin后端来验证的,也可以使用admin后端。首先看下get请求中的cookie中csrftoken参数。
在这里插入图片描述
在这里插入图片描述
我们再来看下post请求cookie中的csrftoken参数和表单中的csrfmiddlewaretoken参数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.session中的csrftoken

在第1部分中我们看到请求的cookie中是存在csrftoken参数的,而且这个参数时长是365天的长cookie。csrftoken其实是每次用户登录时生成的csrftoken,如果用户不注销或登出(django的logout方法),这个参数不会改变,并且每次重新登录时刷新csrftoken。
我们知道cookie时保留在客户端浏览器上的,浏览器是无法长久保留cookie的,可能因为客户端种种问题而丢失(浏览器崩溃、重装、更换浏览器等)。这里就衍生出了将csrftoken保存至sessions,通过服务器来保存csrftoken,并通过后端来验证csrftoken。
具体操作是需要在django的settings中修改配置,使cookie保存至sessions。

CSRF_USE_SESSIONS=True # 在用户会话中而不是在cookie中存储CSRF令牌,实际意义不大。

4.html中的csrftoken

在第1部分中我们看到了表单中的csrfmiddlewaretoken参数,在django的使用中,我们会在表单中使用csrftoken

<form method="post">{% csrf_token %} </form>

表单中的csrf_token 实际上就是csrfmiddlewaretoken。
在这里插入图片描述

5.装饰器中的csrf函数

我们经常看到很多教程在遇到403报错时,会在django后端使用csrf_exempt装饰器。一般都是在def方法中使用@csrf_exempt,在class类方法中使用@method_decorator(csrf_exempt, name=‘dispatch’)。
csrf_exempt的真正原理是改变csrf_exempt状态为True,在CsrfViewMiddleware中间件的process_view方法中直接跳过csrftoken和csrfmiddlewaretoken的加密校验。

四、前后端不分离场景的正确防御

在django前后端不分离项目中,django通过render方法实现了在表单中生成CsrfViewMiddleware参数。

1.django模板中form表单提交

submit提交

	<form method="post">{% csrf_token %} </form>

2.django模板中ajax提交

前端共有三种方式通过验证,示例如下:

方式一:

function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            // 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;
}
const csrftoken = getCookie('csrftoken');

方式二:

# 也可以通过JavaScript Cookie获得。
const csrftoken = Cookies.get('csrftoken');

方式三:

{% csrf_token %}   # 在HTML中包含CSRF令牌
<script>
	const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
</script>

具体的ajax请求处理如下:

<script>
		const request = new Request(
		    /* URL */,
		    {headers: {'X-CSRFToken': csrftoken}}
		);
		fetch(request, {
		    method: 'POST',
		    mode: 'same-origin'  // Do not send CSRF token to another domain.
		}).then(function(response) {
		    // ...
		});	
</script>

综上所述,Cookies中获取的csrftoken写入到表单的csrfmiddlewaretoken肯定时能校验通过的。前边我们说到,cookie中可以存储csrftoken,sessions中也可以,针对不同的配置,使用的方式时不同的。主要是CSRF_USE_SESSIONS 和 CSRF_COOKIE_HTTPONLY参数。

当CSRF_USE_SESSIONS或CSRF_COOKIE_HTTPONLY 为默认值,即Flase时,三种方式均可。
当CSRF_USE_SESSIONS或CSRF_COOKIE_HTTPONLY 为True时,只能使用方式三。

五、前后端分离场景的正确防御

我使用的前后端分离是基于django+vue的,django后端使用drf和jwt,并且通过django-cors-headers处理跨域问题。在涉及到网络安全的时候,处理csrf防御问题衍生出了本博客。基于cookie和jwt机制,jwt是不需要处理csrf攻击的,csrf针对的是cookie验证登录方式。
JWT机制如果需要实现CSRF防护,需要后端提供csrfmiddlewaretoken参数供前端调用,并在使用post、put和delete请求时添加到headers中。
我们项目需要处理请求的幂等性,将csrfmiddlewaretoken设置为幂等性的验证token。

1.django提供接口

urls.py文件

urlpatterns = [
    path('get_csrf_token/', get_csrf_token),  # 获取csrf_token
]

views.py文件

from django.middleware.csrf import get_token

def get_csrf_token(request):
    csrftoken= get_token(request)
    return JsonResponse({'csrftoken': csrftoken})

2.现在所有函数都应该去除csrf装饰器

3.vue获取csrftoken添加至请求

六、错误:请求中无cookie参数

django系统需要实现登录,response中才会附加cookie和sessions信息,示例如下:

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

[外链图片转存中…(img-BNicDcmr-1714912359486)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值