1、问题

​ 开启 csrf 后 列表页面没有数据

​ 页面console.log(403)

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

2、科普

​ 首先,科普一下,什么是"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向服务器发起请求,此时服务器收到这个请求会 认为这是合法的请求,并返回根据请求完成相应的服务端更新。

3、spring security 中的几个关键点

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

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

​ 3)我在科普下:spring Security 3默认关闭csrf,Spring Security 4默认启动了csrf

​ 4)如果不采用csrf,可禁用security的csrf ,如下

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()……………….csrf().disable();}
## 4、重点解决问题 

我想开启且有效,如下配置:

JAVA配置端该怎么做

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()……………….csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}

###H5端怎么做

说明下网上方法大致有三种,我这里结合我们自己的平台(SpringBoot[v1.5.12]+SpringSecurity[v4.2.5]+ Thymeleaf[v2.1.3])是这么做的

//全局index页面 不需要每个页面 都写
<meta name="_csrf_parameter" th:content="${_csrf.parameterName}" th:if="${_csrf}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" th:if="${_csrf}" />
<meta name="_csrf" th:content="${_csrf.token}" th:if="${_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提交思考局部刷新

var headers = {};headers['X-CSRF-TOKEN'] = "[[${_csrf.token}]]"; //参数headers: headers

转载于:https://blog.51cto.com/360douruanliang/2116591

SpringBoot +spring security 与CSRF有关的几个 问题相关推荐

  1. 【笔记】springboot+spring security登录流程实现

    在登录控制器中添加一个登录接口login,在其中验证验证码.用户名.密码信息.匹配成功之后,执行Spring Security的登录认证机制.登录成功之后,返回Token令牌凭证. SysLoginC ...

  2. springsecurity sessionregistry session共享_要学就学透彻!Spring Security 中 CSRF 防御源码解析...

    今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 上篇文章松哥和大家聊了什么是 CSRF 攻击,以及 CSRF 攻击要如何防御.主要 ...

  3. 要学就学透彻!Spring Security 中 CSRF 防御源码解析

    上篇文章松哥和大家聊了什么是 CSRF 攻击,以及 CSRF 攻击要如何防御.主要和大家聊了 Spring Security 中处理该问题的几种办法. 今天松哥来和大家简单的看一下 Spring Se ...

  4. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  5. Springboot Spring Security +Jwt+redis+mybatisPlus 动态完成 前后端分离认证授权

    Springboot Spring Security +Jwt 动态完成 前后端分离认证授权 文章目录 Springboot Spring Security +Jwt 动态完成 前后端分离认证授权 前 ...

  6. SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  7. 框架使用SpringBoot + Spring Security Oauth2 +PostMan

    框架使用SpringBoot + Spring Security Oauth2  主要完成了客户端授权  可以通过mysql数据库读取当前客户端表信息进行验证,token存储在数据库中 1.引入依赖 ...

  8. SpringBoot + Spring Security 简单入门

    这篇文章主要介绍了SpringBoot + Spring Security 简单入门 Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考 ...

  9. SpringBoot + Spring Security Oauth2 客户端授权

    框架使用SpringBoot + Spring Security Oauth2  主要完成了客户端授权  可以通过mysql数据库读取当前客户端表信息进行验证,token存储在数据库中 1.引入依赖 ...

  10. Spring Security 的 CSRF 的相关资料

    近期,因为需要研究 Spring Security 的安全机制,因为 Spring Security 说可以帮助避免 CSRF 攻击. 因此特地考古了相关的内容. 简单点解释就是 CSRF 盗用了你的 ...

最新文章

  1. python逻辑运算符不懂_Python运算符之逻辑运算符
  2. Flex 常见问题解答(from MM)
  3. java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...
  4. java异常处理方式推荐做法_谈谈Java异常处理这件事儿
  5. 新年了,我也来kuso一下.......(yy帖~~)
  6. oracle中存储函数,oracle中存储函数与存储过程的区别介绍
  7. 新广告法涉及的敏感词列表
  8. 如何拼局域网所有ip_查看局域网内所有ip
  9. Java后端技术概览
  10. 聊天室 作业 java_java大作业设计报告-java聊天室.docx
  11. HCIE学习笔记(2)之ISIS Overload
  12. CSP 201903-5 317号子任务 暴力30分+优化100分
  13. 本科计算机专业考研集成电路,集成电路工程专业考研院校排名
  14. Phython画星空(较复杂)
  15. 【office相关】excel 中使用 switch函数
  16. 需求与商业模式创新-需求9-原型
  17. java获得程序运行时间_java中获得程序运行时间的方法(转)
  18. 九连环解法( 基于递归 )
  19. LaTeX中如何使图片插入紧跟在当前文字之后
  20. 在网页调用微信支付,并解决IOS调用提示“缺少参数timeStamp”问题

热门文章

  1. 再学 GDI+[65]: 路径画刷(5) - SetGammaCorrection
  2. CentOS 6.0 下 VNC 配置方法
  3. JSP+JavaBean+Servlet工作原理实例讲解
  4. IIS出现server application error的解决办法
  5. 被信息控制的我,心感不安
  6. linux内核与用户之间的通信方式——虚拟文件系统、ioctl以及netlink .
  7. 深入解读Linux进程调度系列(5)——调度的入口
  8. S3C2440时钟电源管理
  9. 天梯赛练习集--L1-009 (分式求和)
  10. vue拦截器刷新登陆页面_vue页面跳转拦截器