1. 问题

前面几篇博客 spring security在集成spring boot的微服务框架后,实现了cas认证和权限控制。但是在使用 postman 进行调用的时候出现这个问题

HTTP Status 403-Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
  • 1
  • 1

然后我上网查找了这个CSRF 资料整理如下:

Spring Security 4.0之后,引入了CSRF,默认是开启。不得不说,CSRF和RESTful技术有冲突。CSRF默认支持的方法: GET|HEAD|TRACE|OPTIONS,不支持POST。

科普一下,什么是csrf,这是一个web应用安全的问题,CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack” 或者Session Riding,攻击方通过伪造用户请求访问受信任站点。

我们知道,客户端与服务端在基于http协议在交互的数据的时候,由于http协议本身是无状态协议,后来引进了cookie的 方式进行记录服务端和客户端的之间交互的状态和标记。cookie里面一般会放置服务端生成的session id(会话ID)用来识别客户端访问服务端过 程中的客户端的身份标记。

在跨域 (科普一下:同一个ip、同一个网络协议、同一个端口,三者都满足就是同一个域,否则就有跨域问题) 的情况下, session id可能会被恶意第三方劫持,此时劫持这个session id的第三方会根据这个session id向服务器发起请求,此时服务器收到这个请求会 认为这是合法的请求,并返回根据请求完成相应的服务端更新。

比较关键的一点是,

如果这个http请求是get方式发起的请求,意味着它只是访问服务器 的资源,仅仅只是查询,没有更新服务器的资源,所以对于这类请求,spring security的防御策略是允许的,

如果这个请求是通过post请求发起的, 那么spring security是默认拦截这类请求的,因为这类请求是带有更新服务器资源的危险操作,如果恶意第三方可以通过劫持session id来更新 服务器资源,那会造成服务器数据被非法的篡改,所以这类请求是会被Spring security拦截的,在默认的情况下,spring security是启用csrf 拦截功能的,这会造成,在跨域的情况下,post方式提交的请求都会被拦截无法被处理(包括合理的post请求),前端发起的post请求后端无法正常 处理,虽然保证了跨域的安全性,但影响了正常的使用,如果关闭csrf防护功能,虽然可以正常处理post请求,但是无法防范通过劫持session id的非法的post请求,所以spring security为了正确的区别合法的post请求,采用了token的机制。

在跨域的场景下,客户端访问服务端会首先发起get请求,这个get请求在到达服务端的时候,服务端的Spring security会有一个过滤 器 CsrfFilter去检查这个请求,如果这个request请求的http header里面的X-CSRF-COOKIE的token值为空的时候,服务端就好自动生成一个 token值放进这个X-CSRF-COOKIE值里面,客户端在get请求的header里面获取到这个值,如果客户端有表单提交的post请求,则要求客户端要 携带这个token值给服务端,在post请求的header里面设置_csrf属性的token值,提交的方式可以是ajax也可以是放在form里面设置hidden 属性的标签里面提交给服务端,服务端就会根据post请求里面携带的token值进行校验,如果跟服务端发送给合法客户端的token值是一样的,那么 这个post请求就可以受理和处理,如果不一样或者为空,就会被拦截。由于恶意第三方可以劫持session id,而很难获取token值,所以起到了 安全的防护作用。


2. 解决

原因找到了:spring Security 3默认关闭csrf,Spring Security 4默认启动了csrf。
 
解决方案: 
如果不采用csrf,可禁用security的csrf

Java注解方式配置:

加上 .csrf().disable()即可。

修改前WebSecurityConfig.java

    @Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll().and().formLogin().loginPage("/login").permitAll().and().logout().logoutUrl("/logout").logoutSuccessUrl("/hello").permitAll();http.addFilterBefore(customizeFilterSecurityInterceptor, FilterSecurityInterceptor.class).csrf().disable();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

参考资料: 
http://blog.csdn.net/icanactnow2/article/details/53515844 
http://group.jobbole.com/24128/ 
http://www.cnblogs.com/yjmyzz/p/customize-CsrfFilter-to-ignore-certain-post-http-request.html

spring security CSRF 问题 Invalid CSRF Token 'null' was found on ......相关推荐

  1. refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token

    原标题:「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token 前言:Spring Cloud 分布式中的登录如何可视化的管理目前下发的令牌.使用情况. ...

  2. Spring上传时报Invalid CSRF Token错误解决方案

    概述 使用spring security之后,默认上传文件会报这个错,解决方案有下面两个: 解决方案一: 将 MultipartFilter 放在 springSecurityFilterChain ...

  3. 使用Spring Security和Thymeleaf进行CSRF保护

    1. 简介 Thymeleaf是一个Java模板引擎,用于处理和创建HTML,XML,JavaScript,CSS和纯文本.有关Thymeleaf和Spring的介绍,请查看这篇文章. 在本文中,我们 ...

  4. Spring Security + WebSocket——@MessageMapping中Authentication为NULL解决方案之一

    问题描述 2020-08-06 15:55:53.988 ERROR 29260 --- [boundChannel-17] .WebSocketAnnotationMethodMessageHand ...

  5. Spring Security Oauth2 认证(获取token/刷新token)流程

    文章原作者链接地址:https://blog.csdn.net/gangsijay888/article/details/81977796 记下来以便以后查看 1.本文介绍的认证流程范围 本文主要对从 ...

  6. 使用Spring Security OAuth2使用JWT生成token及自定义token携带的信息(十)

    写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟.多谢!如果我的博客对你有帮助,欢迎进行评论✏️✏️.点赞

  7. Spring Security CSRF防御源码分析

    一.CSRF简介 1.CSRF是什么? CSRF(Cross-site request forgery),也被称为:one click attack/session riding,中文名称:跨站请求伪 ...

  8. spring security CSRF防护

    CSRF是指跨站请求伪造(Cross-site request forgery),是web常见的攻击之一. 从Spring Security 4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻 ...

  9. 后端架构token授权认证机制:spring security JSON Web Token(JWT)简例

    后端架构token授权认证机制:spring security JSON Web Token(JWT)简例 在基于token的客户端-服务器端认证授权以前,前端到服务器端的认证-授权通常是基于sess ...

最新文章

  1. WIN7下,联想A30T通过USB连接上网
  2. 《终于有人说出来了——Java不适合于作为主要编程教学语言》我的看法
  3. word文档基本编辑功能_word基本编辑的方法?word基本知识文件操作和文本编辑?...
  4. 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理
  5. ap模式和sta模式共存_锐捷AP缺省VLAN和用户VLAN那些事儿 | 运维实战家
  6. express不是内部或外部命令,也不是可运行的程序或批处理文件
  7. Java web 应用全局变量_将properties文件的配置设置为整个Web应用的全局变量。
  8. 软件工作相关考试001---PMP等各种考试
  9. Swift 面向协议编程入门
  10. 全网首发:安装Python(或其他软件)出现0x80072f7d错误的解决办法
  11. python气象包_Python-Cartopy包: 地图投影
  12. 联想小新潮5000 完美黑苹果 EFI文件
  13. sqlite数据库可视化工具—— DB.Browser安装说明
  14. FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比
  15. 计算机考试中的移动,WPSOffice2002中表格的移动方法
  16. r语言 svycoxph_R语言之cox回归分析
  17. 讲述:一个月薪 12000 的北京程序员的真实生活
  18. wegame导致win10无限重启问题解决
  19. 2022年云办公行业研究报告
  20. 【猿如意】中的『XMind』工具详情介绍

热门文章

  1. 保护企业网络安全,不要忽视数据
  2. 深度操作系统 15 发布 —— 不忘初心,追逐梦想
  3. 【技术精华汇总】不一样的技术创新——阿里巴巴2016双11背后的技术
  4. Formal Languages and Compilers-LL(1),FIRST and FOLLOW
  5. 【技术总结】几种常用的无线串行通信技术
  6. Android赚钱的方法--界面嵌入有米广告(持续关注中)
  7. 我以前用过的一个洗牌算法
  8. 如何删除SharePoint的循环日历项目
  9. 深入剖析微软ASP.NET Ajax中的数据绑定构架下篇之二
  10. OpenCV在Python上的调用( import cv2的解决办法)