SpringSecurity中的CSRF解读

从刚开始学习SpringSecurity时,在配置类中一直存在这样一行代码:http.csrfo.disable()

如果没有这行代码导致用户无法被认证。这行代码的含义是:关闭 csrf 防护。

什么是CSRF

CSRF (Cross-site request forgery) 跨站请求伪造,也被称为”OneClick Attack” 或者 Session Riding。通过伪造用户请求访问受信任站点的非法请求访问。

跨域:只要 网络协议,ip 地址,端口中任何—个不相同就是跨域请求。

客户端与服务进行交互时,由于 http 协议本身是无状态协议,所以引入了cookie进行记录客户端身份。在cookie中会存放session 用来识别客户端身份的。

在跨域的情况下,session id 可能被第三方恶意劫持,通过这个session id 向服务端发起请求时,服务端会认为这个请求是合法的,可能发生很多意想不到的事情。

那么,究竟什么是跨站请求伪造,面对这个问题我们又该如何应对呢?

从安全的角度来讲,你可以将 CSRF 理解为一种攻击手段,即攻击者盗用了你的身份,然后以你的名义向第三方网站发送恶意请求。我们可以使用如下所示的流程图来描述 CSRF:

具体的流程如下:

  • 用户浏览并登录信任的网站 A,通过用户认证后,会在浏览器中生成针对 A 网站的 Cookie(session id);
  • 用户在没有退出网站 A 的情况下访问网站 B,然后网站 B 向网站 A 发起一个请求;
  • 用户浏览器根据网站 B 的请求,携带 Cookie 访问网站 A;
  • *由于浏览器会自动带上用户的 Cookie,所以网站 A 接收到请求之后会根据用户具备的权限进行访问控制,这样相当于用户本身在访问网站 A,从而网站 B 就达到了模拟用户访问网站 A 的操作过程。

显然,从应用程序开发的角度来讲,CSRF 就是系统的一个安全漏洞,这种安全漏洞也在 Web 开发中广泛存在。

基于 CSRF 的工作流程,进行 CSRF 保护的基本思想就是为系统中的每一个连接请求加上一个随机值,我们称之为 csrf_token。这样,当用户向网站 A 发送请求时,网站 A 在生成的 Cookie 中就会设置一个 csrf_token 值。而在浏览器发送请求时,提交的表单数据中也有一个隐藏的 csrf_token 值,这样网站 A 接收到请求后,一方面从 Cookie 中提取出 csrf_token,另一方面也从表单提交的数据中获取隐藏的 csrf_token,将两者进行比对,如果不一致就代表这就是一个伪造的请求。

Spring Security中的CSRF

从Spring Security4开始CSRF防护默认开启。默认会拦截请求。进行CSRF处理,CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为 token(token 在服务端产生) 的内容,如果token和服务端的token匹配成功,则正常访问。

编写控制器方法

编写控制器方法,跳转到 templates 中login.html 页面。

Original: https://www.cnblogs.com/bearbrick0/p/16130738.html
Author: BearBrick0
Title: SpringSecurity中的CSRF解读

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684943/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Game Engine Architecture 10

    【 Game Engine Architecture 10】 1、Full-Screen Antialiasing (FSAA) also known as super-sampl…

    技术杂谈 2023年5月31日
    088
  • ArcGIS Pro地图范围和视野范围

    csharp;gutter:true; atialReference sr3857 = SpatialReferenceBuilder.CreateSpatialReference…

    技术杂谈 2023年5月30日
    082
  • vnpy源码阅读学习(8):关于app

    关于app 在入口程序中,我们看到了把 gateway, app, 各类的 engine都添加到 mainEngine中来。不难猜测 gateway主要是处理跟外部的行情,接口各方…

    技术杂谈 2023年7月11日
    088
  • Git简介

    Git是一个开源的分布式版本控制系统,是目前主流的版本控制系统,很多软件项目都会用它做源代码管理。Git的常用操作想必很多人都会,但是可能了解Git内部原理的人并不多。了解一些底层…

    技术杂谈 2023年7月11日
    080
  • 并查集(UnionFind)

    并查集和其他树形结构不一样,是由孩子指向父亲,它解决了一些连接问题,怎么才能确定两个点是否相连呢?并查集可以非常快的确定两个点是否连接。 如何确定连个点是否连接呢? 我们可以用一个…

    技术杂谈 2023年7月23日
    080
  • 宕机了,Redis数据丢了怎么办?

    前言 什么是AOF? 三种写回策略 日志文件太大怎么办? AOF重写会阻塞主线程吗? AOF的缺点 总结 什么是RDB? 给哪些数据做快照? 快照时能够修改数据吗? 多久做一次快照…

    技术杂谈 2023年7月23日
    099
  • 基于TCP与HTTP的RPC调用的区别

    基于TCP与HTTP的RPC调用的区别 RPC即远程服务调用 出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存…

    技术杂谈 2023年7月11日
    074
  • 这个开源组织里的项目都是精品(第二弹)

    前言 之前我写过一篇文章——《这个开源组织里的项目都是精品》,里面列举了Dromara开源组织的4个java项目,每一个都轻量且实用,受到了很多小伙伴的喜爱。Dromara这个开源…

    技术杂谈 2023年7月11日
    066
  • Ubuntu 18.04安装sysv-rc-conf

    sudo nano /etc/apt/sources.list 加入deb http://archive.ubuntu.com/ubun…

    技术杂谈 2023年7月11日
    075
  • 九、基础语法

    一、JAVA特点 java是面向对象的 java语言健壮,java的强类型机制,异常处理,垃圾自动回收机制等是java程序健壮的重要保证 java是跨平台性的,一次编译(.clas…

    技术杂谈 2023年7月11日
    083
  • phpcms如何在前台文章列表显示来源

    phpcms的文章来源分为两种,一种是在后台来源中添加完成的,这种”来源”的相关数据存放于数据库的copyfrom表中,通过id和news_data表相关联…

    技术杂谈 2023年7月11日
    095
  • 【SSM框架】SpringMVC笔记 – 汇总

    1、什么是 SpringMVC? SpringMVC 是基于 MVC 开发模式的框架,用来优化控制器。它是 Spring 家族的一员,它也具备 IOC 和 AOP。 什么是MVC?…

    技术杂谈 2023年7月10日
    0106
  • 图文详解YUV420数据格式

    很多人对YUV数据格式不清楚,以至于在做视频的时候出现了一些不可预知的错误(比如说图像带有点、颜色不对等)。今晚是周末放假,我就抽点时间来给大家介绍一下。 提示: 读下面的文字时,…

    技术杂谈 2023年5月31日
    094
  • 开源基础框架csx-bsf-all【开源】【原创】

    Git地址 技术架构 BSF 为 base service framework 的简写,定义为技术团队的基础框架,用于基础服务的集成和跟业务无关的基础技术集成。 BSF集成了自研的…

    技术杂谈 2023年7月23日
    059
  • Activiti7源码学习

    启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是…

    技术杂谈 2023年7月24日
    079
  • python3GUI–天气预报小工具By:PyQt5(附源码)

    @ 一.准备工作 二.预览 1.启动 2.添加城市 三.设计流程 1.UI设计(草图) 2.UI设计(QT设计师) 3.解释 四.源代码 五.总结 之前用tk写过一款python3…

    技术杂谈 2023年6月21日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球