Backend - Django CSRF 跨域请求伪造

2024-02-02 07:12

本文主要是介绍Backend - Django CSRF 跨域请求伪造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、CSRF & XSS

(一)CSRF

1. 含义

2. 攻击原理

(1)浏览器特点

(2)攻击方式

(二)XSS

1. 含义

2. 攻击原理

(三)二者区别

二、Django Ajax CSRF 防御

(一)令牌同步模式(Synchronizer Token Pattern,简称STP)

1. 原理

2. 设置验证

(二)双重cookie验证(Double Submit Cookie)

1. 原理

2. 设置验证

(三)X-Csrf-Token验证(Cookie-to-header token)

1. 原理

2. 设置验证

三、设定 CSRF 验证

(一)settings.py

(二)base.html

1. 针对 ajax 请求,body 里添加{% csrf_token %}

2. 针对 form 表单,form 表单里添加{% csrf_token %}

(三)JS

1. 针对 双重cookie验证

(1)方法1

(2)方法2

2. 针对 X-Csrf-Token验证(Cookie-to-header token)

(1)方法1

3. 针对所有模式的综合验证

(1)写入位置

(2)引入顺序

四、关闭 CSRF 防御功能

1. 方法1:全局禁用

2. 方法2:局部禁用

五、Django CSRF 的控制台Error

(一)Reason given for failure: CSRF cookie not set.

1. 原因

2. 解决

(二)CSRF verification failed. Request aborted.

1. 原因

(1)原因1:csrf_token 过期

(2)原因2:请求头的 csrf_token 与session存储的token不匹配

(3)原因3:模板里没有csrfmiddlewaretoken


一、CSRF & XSS

(一)CSRF

1. 含义

        跨站请求伪造(Cross-site Request Forgery )。

2. 攻击原理

(1)浏览器特点

同个浏览器上,无论是目标网站A还是其他网站B,发送对目标网站A的HTTP请求,都会自动带上目标网站A的cookie,发送给服务端。

(2)攻击方式

同个浏览器上,当用户登录了目标网站(已登录状态),再进入攻击网站,攻击网站发送对目标网站的HTTP请求,则会自动带上“已登录的目标网站”的cookie,就可以进行攻击服务端。

(二)XSS

1. 含义

跨站脚本攻击(Cross-Site Scripting,为了和 CSS 区分,则简称 XSS)。

2. 攻击原理

在目标网站上注入恶意脚本进行攻击。(攻击者提交恶意代码,浏览器再执行恶意代码,篡改了网页)

(三)二者区别

CSRF 是 HTTP 问题,XSS 是代码注入问题。

CSRF需登录目标网站,XSS不用登录。

二、Django Ajax CSRF 防御

(一)令牌同步模式(Synchronizer Token Pattern,简称STP)

1. 原理

(1)找到数据库Session的session_csrftoken参数。成功登录网站后,后端随机产生一个csrftoken值,并把该值保存在数据库Session参数中。

(2)找到网页模板的隐藏csrfmiddlewaretoken名的标签。初始化某界面时,前端模板会根据{% csrf_token %}生成一个隐藏的name='csrfmiddlewaretoken'的input标签,存放后端随机生成的csrftoken值。

(3)用户进行 ajax post 请求。post请求时,csrfmiddlewaretoken值会一并放在请求数据(或头信息)中,发送给后端。后端会根据前端csrfmiddlewaretoken的 value值、和服务端数据库 public.django_session 表的 session_csrftoken参数值,判断两个csrf_token解密后的值是否一致。

(4)一致则正常访问,不一致则拒绝访问。

2. 设置验证

在第三点中。

(二)双重cookie验证(Double Submit Cookie)

1. 原理

(1)找到浏览器cookie的csrftoken。成功登录网站后,整个浏览器中Cookie的csrftoken属性,存放后端随机生成的csrftoken值。

(2)找到网页模板的隐藏csrfmiddlewaretoken名的标签。初始化某界面时,前端模板会根据{% csrf_token %}生成一个隐藏的 name='csrfmiddlewaretoken' 的input标签,存放后端随机生成的csrftoken值。

(3)用户进行 ajax post 请求。post请求时,csrfmiddlewaretoken值会一并放在请求数据(或头信息)中,发送给后端。后端会根据前端csrfmiddlewaretoken的 value值、和浏览器Cookie的csrftoken值,判断两个csrf_token解密后的值是否一致。

(4)一致则正常访问,不一致则拒绝访问。

2. 设置验证

在第三点中。

(三)X-Csrf-Token验证(Cookie-to-header token)

1. 原理

(1)确保同源政策。

(2)系统主要使用JavaScript进行交互。(因为恶意攻击无法读取cookie值并复制到HTTP请求头中)

(3)将cookie上的token复制到HTTP请求头中。

(4)后端验证HTTP请求头中token的存在和完整性。

(5)X-Csrf-Token头存在且完整,则正常访问,否则拒绝访问。

2. 设置验证

在第三点中。

三、设定 CSRF 验证

以下主要针对基于 django 使用 ajax 发送 post 请求时的验证。

(一)settings.py

        MIDDLEWARE里添加'django.middleware.csrf.CsrfViewMiddleware'  # 设置CSRF检测功能

(二)base.html

1. 针对 ajax 请求,body 里添加{% csrf_token %}

例如:

<body id="body">{% csrf_token %}<div>{% block content %} {% endblock %}</div>
</body>

渲染后:

<body id="body"><input type="hidden" name="csrfmiddlewaretoken" value="vUAPUcghecxAGlraGaFGbikXz3SOPcWtmMtk8o1UQ1PpYYAhxg2cAiAaLyQ9HEY9" /><div>插入的子模板</div>
</body>

2. 针对 form 表单,form 表单里添加{% csrf_token %}

因为若在 base.html 中加入 {% csrf_token %},是不在 form 表单的范围内。所以需要在 form 表单里添加。

例如:

<form action="http://127.0.0.1:8080/myApp/test" method=POST>{% csrf_token %}<input type="submit"/>
</form>

(三)JS

1. 针对 双重cookie验证

(1)方法1

        后端将csrftoken传到前端(放置在隐藏标签里),发送post请求时,请求数据data中加上csrftoken,一起发送给后端。

        在base.html中的script里写上。

$.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
(2)方法2

        后端将csrftoken传到前端(放置在隐藏标签里),发送post请求时,请求数据data中加上csrftoken。

        在base.html中的script里写上。

$.ajaxSetup({data: {csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val()},
});

2. 针对 X-Csrf-Token验证(Cookie-to-header token)

(1)方法1

        cookie中存在csrftoken,请求头headers中加上csrftoken。

        在base.html中的script里写上。

        前提:

                ① 引入jquery-3.1.1.min.js和jquery.cookie.js

                ② 引入顺序:jQuery库文件必须先于cookie文件。

$.ajaxSetup({headers:{ "X-CSRFtoken":$.cookie("csrftoken")},
});

3. 针对所有模式的综合验证

(1)写入位置

        前面两个验证的所有方法只能写在html中,不能写到外部js文件。因为{{ csrf_token }} 渲染在模板上,若以外部文件引入,则不能执行。

        以下代码可以写在外部js文件里,并在 base.html 里引入该js文件。

(2)引入顺序

        该 js 文件的引入顺序必须在 jquery.js 文件之后。

/*** 【 Cross Site Request Forgery TOKEN 】*  Forbidden 403 - CSRF check with an AJAX POST request in Django.*/
jQuery(document).ajaxSend(function (event, xhr, settings) {function getCookie(name) {let cookieValue = null;if (document.cookie && document.cookie !== '') {let cookies = document.cookie.split(';');for (let i = 0; i < cookies.length; i++) {let 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;}function sameOrigin(url) {// url could be relative or scheme relative or absolutelet host = document.location.host; // host + portlet protocol = document.location.protocol;let sr_origin = '//' + host;let origin = protocol + sr_origin;// Allow absolute or scheme relative URLs to same originreturn (url === origin || url.slice(0, origin.length + 1) === origin + '/') ||(url === sr_origin || url.slice(0, sr_origin.length + 1) === sr_origin + '/') ||// or any other URL that isn't scheme relative or absolute i.e relative.!(/^(\/\/|http:|https:).*/.test(url));}function safeMethod(method) {return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}if (!safeMethod(settings.type) && sameOrigin(settings.url)) {xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));}
});

四、关闭 CSRF 防御功能

不推荐关闭 CSRF 防御功能,因为取消了 CSRF 防御保护。

1. 方法1:全局禁用

        settings.py中,注释掉'django.middleware.csrf.CsrfViewMiddleware'

2. 方法2:局部禁用

        views.py中,导入from django.views.decorators.csrf import csrf_exempt;

        并给要处理post数据的函数补充@csrf_exempt(post函数有request参数)。

五、Django CSRF 的控制台 Error

(一)Reason given for failure: CSRF cookie not set.

1. 原因

        django 中使用 jquery ajax post 数据出现 403 错误。

        即,settings设置了Django CSRF检测功能(防止跨站请求伪造),需要在django发送post请求时进行字符串验证,但还没有设置CSRF cookie。

2. 解决

(1)第一种:关闭 CSRF 检测功能

(2)第二种:设定 CSRF 验证

(这两种方式在前面第三点中已介绍)

(二)CSRF verification failed. Request aborted.

1. 原因

(1)原因1:csrf_token 过期

        解决:重新登录(若还未写前端登录,则admin登录)

(2)原因2:请求头的 csrf_token 与session存储的token不匹配

        解决:清除浏览器缓存; 重新登录

(3)原因3:模板里没有csrfmiddlewaretoken

        解决:模板中(或表单内)添加 {% csrf_token %} 

这篇关于Backend - Django CSRF 跨域请求伪造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/669875

相关文章

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Java 中的跨域问题解决方法

《Java中的跨域问题解决方法》跨域问题本质上是浏览器的一种安全机制,与Java本身无关,但Java后端开发者需要理解其来源以便正确解决,下面给大家介绍Java中的跨域问题解决方法,感兴趣的朋友一起... 目录1、Java 中跨域问题的来源1.1. 浏览器同源策略(Same-Origin Policy)1.

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@