在我们的 Spring Security 课程的这篇文章中,我们将研究Spring Security 会话固定以及如何防止我们的 Spring 应用程序中的会话劫持。

Spring Security 会话修复

会话固定是一种非常常见且最常见的攻击类型,恶意攻击者可以通过访问站点来创建会话,然后说服另一个用户使用相同的会话登录(通过向他们发送包含会话的链接标识符作为参数,例如)。将会话固定视为一种漏洞,攻击者将诱骗您登录应用程序,然后使用您的会话访问同一站点。请记住以下要点,以便更好地理解。

  1. 这与会话劫持不同。在会话劫持中,攻击者将窃取您经过身份验证的会话以访问应用程序。
  2. 在会话固定中,攻击者将首先从应用程序获取有效会话,然后将用户重定向到登录页面让您登录,以便他们可以使用会话登录应用程序。

1. 了解会话固定攻击

在我们详细了解Spring 安全会话修复以及安全性如何帮助我们解决这个潜在问题之前,我们必须清楚地了解这个问题。会话固定是一种攻击,可以通过多种方式完成。以下是高级攻击的样子:

  1. 攻击者从我们的应用程序中获取有效的会话 ID。
  2. 他们欺骗受害者进行身份验证,攻击者将在身份验证请求中传递相同的会话 ID。
  3. 受害者使用相同的会话 ID 进行身份验证(我们稍后将讨论相同的会话 ID)。
  4. 攻击者现在可以使用相同的会话 ID 来访问应用程序的安全区域,因为该会话已经通过了应用程序的身份验证。

如果用户没有登录,这不是问题,但是如果应用程序在用户通过身份验证后继续使用相同的会话 id,就会变得很严重。请记住,Spring 安全身份验证依赖于会话 ID 来检查会话是否经过身份验证。使用相同的会话 id,恶意攻击者可以使用相同的会话 id 进行身份验证,无需用户名或密码。这种攻击有多种变体,让我们检查其中的几个:

1.1 随机 SID

有许多应用程序不仅可以接受会话 ID,还可以接受客户端提供的任何其他 ID。如果是这种情况,攻击者很容易生成一个随机 ID 并将其与登录请求一起传递。

1.2 服务器会话 ID

如果应用程序只允许应用程序生成的会话 id,它会增加一个步骤,让攻击者先从应用程序获取有效的会话 id,然后才能欺骗受害者使用他们的会话 id 进行登录。在这种方法中,攻击者几乎没有额外的挑战。

  1. 应用程序会话 ID 是有时间限制的。他们需要确保没有使用无效的会话 ID,并且会话可以在他们使用之前超时。

获得会话后,他们可以将客户重定向到带有会话 ID 的登录页面:https://www.javadevjournal.com/login?SID=987654321。这只是一个示例,但请记住,在典型的基于 Java 的 Web 应用程序中,您可以使用以下选项传递会话 ID:

  1. URL
  2. Cookies
  3. SSL

这是一个高级工作流程,可让您更清楚地了解会话固定攻击的工作原理

2. 使用 Spring Security Session Fixation 进行保护

默认情况下,Spring security 通过在 用户登录时创建新会话或以其他方式更改会话 ID 来保护会话固定攻击。spring security session fixation确保攻击者无法使用旧会话访问应用程序。sessionManagement您可以使用以下配置控制 spring 安全会话固定策略

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()...sessionManagement().sessionFixation().none();
}

Spring Security 为会话管理和会话固定提供了不同的选项,您可以随时根据需要更改或调整它。

会话固定策略 描述
none() Spring security 将禁用会话固定保护。
migrateSession() 当用户成功通过身份验证时,将创建一个新会话并将旧会话值移动到新会话。(默认并适用于大多数情况)
newSession() 当用户成功通过身份验证时,将创建一个新会话,并且不会从旧会话复制任何属性。
changeSessionId() 这是使用新的 Servlet 容器(Servlet 3.1 和更新版本)完成的。用户认证后不会创建新会话,但会更改会话 ID。

当会话固定保护发生时,它会导致在SessionFixationProtectionEvent应用程序上下文中发布

3. Spring Security Session Fixation 是如何工作的?

我们知道默认情况下 Spring Security 提供会话固定保护,我们也可以根据需要对其进行自定义。同样重要的是,我们了解这种保护如何在内部与 Spring 安全性一起工作。Spring security 使用以下类来处理这个问题。

  1. SessionManagementFilter.
  2. SessionAuthenticationStrategy

3.1 会话管理过滤器

检查用户是否是新认证的SessionManagementFilter,如果它是认证的,它会将工作交给SessionAuthenticationStrategy来决定如何处理会话(例如应该迁移或创建新会话。我们可以通过 来控制SessionManagement)。这是SessionManagementFilter过滤器的代码片段:

if (!securityContextRepository.containsContext(request)) {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication != null && !trustResolver.isAnonymous(authentication)) {// The user has been authenticated during the current request, so call the// session strategytry {sessionAuthenticationStrategy.onAuthentication(authentication,request, response);}// other code}
}
  1. 过滤器检查SecurityContextRepository以确定用户是否已通过身份验证。
  2. 如果是新的身份验证,过滤器将调用会话策略来决定应该执行哪个会话身份验证策略(newSessionmigrateSession等等)。
  3. 如果用户当前未通过身份验证,过滤器将检查是否请求了无效的会话 ID(例如,由于超时),并将调用配置的InvalidSessionStrategy.

3.2 会话认证策略

这是一个接口,用于确定用户通过身份验证后应使用哪个 spring 安全会话固定策略。带有弹簧安全性的 OOTB 有不同的可用策略,它们将根据配置触发。例如,SessionFixationProtectionStrategy将处理以下两个用例。

  1. migrateSession()并复制现有会话的所有属性。
  2. newSession(),他们不会从旧会话中复制任何属性。

使用此功能时,请注意以下可能导致某些问题且难以调试的潜在问题:

  1. 如果您HttpSessionBindingListener在自定义对象中使用并使用它,则复制会话属性可能会导致一些问题。
  2. 一个例子是使用 Spring session-scoped beans,DisposableBean假设不再需要 bean,从 session 中删除 bean 将导致调用接口。
  3. 在为应用程序设计安全性时,请牢记这些要点。

概括

在本文中,我们讨论了Spring Security 会话固定保护。本文的源代码作为 Spring 安全教程的一部分在GitHub 上提供。总而言之,我们了解到:

  1. 什么是会话固定问题?
  2. 会话固定攻击如何工作?
  3. 什么是 Spring 安全会话固定保护和不同的选项?
  4. 会话固定如何在 Spring Security 内部工作?

Spring Security 如何防止 Session Fixation 攻击相关推荐

  1. .netcore 如何获取系统中所有session_集群化部署,Spring Security 要如何处理 session 共享?

    前面和大家聊了 Spring Security 如何像 QQ 一样,自动踢掉已登录用户(Spring Boot + Vue 前后端分离项目,如何踢掉已登录用户?),但是前面我们是基于单体应用的,如果我 ...

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

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

  3. 6.Spring Security Session 管理

    用户登录成功后,信息保存在服务器Session中,这节学习下如何管理这些Session.这节将在Spring Security短信验证码登录的基础上继续扩展. Session超时设置 Session超 ...

  4. springsecurity中session失效后怎样处理_结合Spring Security进行web应用会话安全管理

    结合Spring Security进行web应用会话安全管理 在本文中,将为大家说明如何结合Spring Security 管理web应用的会话.如果您阅读后觉得本文对您有帮助,期待您能关注.转发!您 ...

  5. Spring Security教程

    Spring Security教程 Web系统中登录认证(Authentication)的核心就是凭证机制,无论是Session还是JWT,都是在用户成功登录时返回给用户一个凭证,后续用户访问接口需携 ...

  6. Spring Security 参考手册(一)

    Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...

  7. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至: https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc ...

  8. Tomcat的SessionID引起的Session Fixation和Session Hijacking问题

    上一篇说到<Spring MVC防御CSRF.XSS和SQL注入攻击>,今天说说SessionID带来的漏洞攻击问题.首先,什么是Session Fixation攻击和Session Hi ...

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

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

  10. spring security技术分享

    Spring Security技术专题 一.初识认证和授权 1.1 认证 1.2 会话 1.3 授权 1.4 授权的数据模型 1.5 RBAC 1.5.1 角色访问控制 1.5.2 资源访问控制 1. ...

最新文章

  1. Ubuntu下内存泄露检测工具Valgrind的使用
  2. 数据库期末复习样卷,临时抱佛脚高分通过考试
  3. 备份oracle中的大表
  4. java listfiles 使用_Java中list()和listFiles()方法之间的区别
  5. places for finding a consulting job
  6. 语法分析生成器 - LEX
  7. 先天性脑部发育异常_宝宝出现发育迟缓,会有哪些症状?修正育儿知识分享!...
  8. DllImport 自动选择x64或x86 dll
  9. 【算法学习】最优二叉查找树(动态规划)
  10. N皇后问题——通俗易懂地讲解(C++)
  11. BBR开启教程(转)
  12. SAP License:SAP CO ML 物料帐配置
  13. [推荐]WebService开发知识介绍
  14. PE使用万能驱动7解决USB3、NVME驱动问题及台式机、笔记本电脑使用PE因驱动问题不能加载硬盘问题(YOGA 14C 因PE加载不了硬盘亲测可用)
  15. 《穷查理宝典》读书笔记
  16. Django 一文看懂urls.py与views.py的联系
  17. 2018年UI设计趋势概览
  18. UDP传输图片(分包)
  19. 树莓派安装AdGuard Home
  20. C++中为二维数组开辟空间,并释放空间

热门文章

  1. JS加密小结---银行卡号,手机号,姓名加密显示星号
  2. 易经64卦富含的人生哲理
  3. 如何运用知识付费系统,实现内容变现!
  4. java计算器自述文件_自述文件 - Unreal Engine
  5. HTML|下拉框和文本域、文件域
  6. matlab图像噪点消除,基于噪点检测的中值滤波图像去噪方法
  7. 代码弱鸡竟然在CSDN写烘焙博客
  8. 【C++零散】计时chrono
  9. 初中数学定理公式汇编
  10. 2203-python 24点游戏