首页 > 其他分享 >CSRF攻击的原理和spring security的解决方法

CSRF攻击的原理和spring security的解决方法

时间:2023-05-18 16:47:00浏览次数:42  
标签:异步 请求 spring 用户 表单 CSRF security

本文转载自:https://blog.csdn.net/qq_42956993/article/details/110213224

image

一个用户通过浏览器成功登录一个网站,登陆成功后,服务器会返回一个该用户的唯一标识放入浏览器Cookie中,以此作为用户之后操作的唯一凭证。
假设此时该用户在此网站中请求一个表单类的网页,这时候用户又打开了另外的一个网站,而这个网站是一个病毒网站,它直接窃取了Cookie信息,当然也包括唯一身份凭证(所以为什么说cookie不推荐保存重要信息,是有原因的),通过唯一身份凭证,病毒网站直接进行用户所做的表单提交,而服务器是通过这个凭证来匹配用户信息的,服务器这时候无法识别病毒网站所做的操作,误以为是用户操作,此时可能造成用户严重损失。

Spring Security作为Spring提供的一个安全框架,使用它时,其内部便已经对CSRF攻击做了相关的防止工作(除了异步请求,因为异步请求没有前端表单)。

下面说一下Security对CSRF攻击所作的相关工作:

继续上图,然后解释:
image

首先在pom.xml引入:

<!--security-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

当你在项目中导入了SpringSecurity后,整个项目就直接被Security管理。之后我们再次登录相关网站后,在网站上请求一个会返回表单类的网页,这时候服务器不仅仅会存入一个带唯一标识的Cookie信息,还会在表单里带上一个类型为hidden的隐藏输入框,里面封装的就是security提供的另外一个随机唯一身份标识,如图:

image

这个value值是随机生成的,而这时病毒网站可以窃取到用户唯一标识,却无法知道给该用户的随机token,这就能防止csrf攻击所造成的影响。

但是有一些情况,security是无法做处理的,比如异步请求,异步请求是没有前端表单页面的,这时候我们需要在代码中做一些处理配置,才能达到相关的防止CSRF的要求。

下面演示security在异步请求的情况下对防止csrf攻击的一些处理:

首先需要在触发异步请求的前端界面上(index.html)设置以下数据:

<!--访问该页面时,在此处生成CSRF令牌.-->
<meta name="_csrf" th:content="${_csrf.token}">
<meta name="_csrf_header" th:content="${_csrf.headerName}">

当刷新当前界面时,会得到token随机标识,
image

在发送异步请求的js中,将这些数据携带到请求头中。(每个异步请求的请求头都需要这样处理)

// 发送AJAX请求之前,将CSRF令牌设置到请求的消息头中.
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options){
    xhr.setRequestHeader(header, token);
});

之后在提交ajax请求的时候会带着随机生成的token发送给服务器:
image

标签:异步,请求,spring,用户,表单,CSRF,security
From: https://www.cnblogs.com/FengZeng666/p/17412418.html

相关文章

  • SpringBoot中实现文件上传下载的三种解决方案(推荐)
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • SpringBoot02_Mybatis和配置文件
    关于本文的大体框架在上一篇博客一、SpringBoot整合Mybatis(一)配置文件​ 引入springboot与mybatis整合包以及java-connector<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><versi......
  • SpringMVC中实现文件上传下载的三种解决方案(推荐)
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • 【redis】哨兵监控原理-springboot 监控
    连接序列图解: 连接步骤:1.boot应用启动时,会从yml文件中配置的多个sentinel中抽取一个进行连接,sentinel有单独的账号密码,需要区分sentinel于redis主节点的账号密码,同时需要将连接的主从节点masterName告知sentinel。2.boot应用与sentinel协议并鉴权成功后,sentinel会将第一步......
  • spring框架_常见工厂后处理器
    ConfigurationClassPostProcessor:用于解析@ComponentScan@Bean@Import@ImportResourceMapperSacnnerConfigurer:相当于Mybatis的@MapperScanner用于解析被标注的@Mapper接口@mapper注解的解析:@mapper注解是mybatis提供的,用于标明一个接口,spring自然无法管理接口,要将这......
  • Spring初步认识
    1.框架的概念框架就是一些类和接口的集合,通过这些类和接口协调来完成一系列的程序实现;框架就是某些个人或者组织定义了一系列的类或者接口,提前定义好了一些实现,用户可以在这些类和接口的基础之上,使用这些类来迅速的形成某个领域或者某个行业的解决方案,简化开发的过程,提高开发的效......
  • MongoDB + SpringBoot 的基础CRUD、聚合查询
    1、数据准备1.1、springboot导包springboot版本:2.7.10点击查看代码<!--mongodb的包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifact......
  • SpringMVC 异步(长轮询)实现消息定点推送
    $(function(){getMsg();});functiongetMsg(){$.ajax({url:"/polling/msg",type:"get",data:{},success:function(data){if(data......
  • Spring循环依赖那些事儿(含Spring详细流程图)
    本篇不仅仅是介绍Spring循环依赖的原理,而且给出Spring不能支持的循环依赖场景与案例,对其进行详细解析,同时给出解决建议与方案,以后出现此问题可以少走弯路。背景1、循环依赖异常信息应用时间时间久应用多人同时并行开发应用保证迭代进度经常出......
  • Spring Cloud开发实践(六): 基于Consul和Spring Cloud 2021.0的演示项目
    目录SpringCloud开发实践(一):简介和根模块SpringCloud开发实践(二):Eureka服务和接口定义SpringCloud开发实践(三):接口实现和下游调用SpringCloud开发实践(四):Docker部署SpringCloud开发实践(五):Consul-服务注册的另一个选择SpringCloud开发实践(六):基......