java会话固定漏洞_使用Spring Security控制会话

1.概述

在本文中,我们将说明Spring Security如何允许我们控制HTTP会话。此控件的范围从会话超时到启用并发会话和其他高级安全配置。

2.会话何时创建?

我们可以准确控制会话何时创建以及Spring Security如何与之交互:

always - 如果一个会话尚不存在,将始终创建一个会话

ifRequired - 仅在需要时创建会话(默认)

never - 框架永远不会创建会话本身,但如果它已经存在,它将使用一个

stateless - Spring Security不会创建或使用任何会话

...

Java配置:

@Override

protected void configure(HttpSecurity http) throws Exception {

http.sessionManagement()

.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)

}

了解此配置仅控制Spring Security的功能非常重要 - 而不是整个应用程序。如果我们不指示Spring Security,可能无法创建会话,但我们的应用程序可能会!

默认情况下,Spring Security会在需要时创建会话 - 这是“ifRequired”。

对于更无状态的应用程序,“never”选项将确保Spring Security本身不会创建任何会话;但是,如果应用程序创建了一个,那么Spring Security将使用它。

最后,最严格的会话创建选项 - “stateless” - 保证应用程序根本不会创建任何会话。

这是在Spring 3.1中引入的,它将有效地跳过部分Spring Security过滤器链。主要是会话相关的部分,如HttpSessionSecurityContextRepository,SessionManagementFilter,RequestCacheFilter。

这些更严格的控制机制直接暗示不使用cookie,所以每个请求都需要重新进行身份验证。这种无状态架构适用于REST API及其无状态约束。它们也适用于基本和摘要式身份验证等身份验证机制。

3. Under The Hood

在执行身份验证过程之前,Spring Security将运行一个负责在请求之间存储安全上下文的过滤器-SecurityContextPersistenceFilter。上下文将根据策略存储 - 默认情况下为HttpSessionSecurityContextRepository - 它使用HTTP会话作为存储。对于strict create-session =“stateless”属性,此策略将替换为另一个 - NullSecurityContextRepository - 并且不会创建或使用会话来保留上下文。

4.并发会话控制

当已经过身份验证的用户尝试再次进行身份验证时,应用程序可以通过以下几种方式之一处理该事件。它可以使用户的活动会话无效,并使用新会话再次对用户进行身份验证,或者允许两个会话同时存在。

启用并发会话控制支持的第一步是在web.xml中添加以下侦听器:

org.springframework.security.web.session.HttpSessionEventPublisher

或者将其定义为Bean - 如下所示:

@Bean

public HttpSessionEventPublisher httpSessionEventPublisher() {

return new HttpSessionEventPublisher();

}

这对于确保在销毁会话时通知Spring Security会话注册表是至关重要。

要为同一用户启用允许多个并发会话的方案,应在XML配置中使用元素:

或者,通过Java配置:

@Override

protected void configure(HttpSecurity http) throws Exception {

http.sessionManagement().maximumSessions(2)

}

5.会话超时

会话超时后,如果用户发送的会话ID已过期,则会将其重定向到可通过命名空间配置的URL:

同样,如果用户发送的会话ID未过期但完全无效,则它们也会被重定向到可配置的URL:

...

相应的Java配置:

http.sessionManagement()

.expiredUrl("/sessionExpired.html")

.invalidSessionUrl("/invalidSession.html");

6.防止使用URL参数进行会话跟踪

在URL中公开会话信息的安全风险越来越大(从2007年的第7位到2013年在OWASP排行榜前10位的第2位)。

从Spring 3.0开始,现在可以通过在命名空间中设置disable-url-rewriting =“true”来禁用将jsessionid附加到URL的URL重写逻辑。

或者,从Servlet 3.0开始,也可以在web.xml中配置会话跟踪机制:

COOKIE

编程方式

servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

这将选择存储JSESSIONID的位置 - 在cookie或URL参数中。

7. Spring Security的会话固定保护

该框架通过配置在用户已有会话的情况但尝试再次进行身份验证时,提供了针对典型会话固定攻击的保护:

...

相应的Java配置:

http.sessionManagement()

.sessionFixation().migrateSession()

默认情况下,Spring Security启用了此保护(“migrateSession”) - 在身份验证时,会创建一个新的HTTP会话,旧的会话将失效,旧会话的属性将被复制。

如果这不是所需的行为,则可以使用其他两个选项:

设置“none”时,原始会话不会失效

设置“newSession”时,将创建一个干净的会话,而不会复制旧会话中的任何属性

8.安全会话Cookie

接下来,我们将讨论如何保护会话cookie。

我们可以使用httpOnly和secure标签来保护我们的会话cookie:

httpOnly:如果为true,那么浏览器脚本将无法访问cookie

secure:如果为true,则cookie将仅通过HTTPS连接发送

我们可以在web.xml中为会话cookie设置这些标志:

1

true

true

从Java servlet 3开始,此配置选项可用。默认情况下,http-only为true且secure为false。

我们来看看相应的Java配置:

public class MainWebAppInitializer implements WebApplicationInitializer {

@Override

public void onStartup(ServletContext sc) throws ServletException {

// ...

sc.getSessionCookieConfig().setHttpOnly(true);

sc.getSessionCookieConfig().setSecure(true);

}

}

如果我们使用Spring Boot,我们可以在application.properties中设置这些标志:

server.servlet.session.cookie.http-only=true

server.servlet.session.cookie.secure=true

最后,我们还可以使用Filter手动实现此目的:

public class SessionFilter implements Filter {

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

HttpServletResponse res = (HttpServletResponse) response;

Cookie[] allCookies = req.getCookies();

if (allCookies != null) {

Cookie session =

Arrays.stream(allCookies).filter(x -> x.getName().equals("JSESSIONID"))

.findFirst().orElse(null);

if (session != null) {

session.setHttpOnly(true);

session.setSecure(true);

res.addCookie(session);

}

}

chain.doFilter(req, res);

}

}

9.Session使用

9.1。 Session Scoped Beans

只需在web-Context中,使用@Scope注释声明的bean:

@Component

@Scope("session")

public class Foo { .. }

或者使用XML:

然后,bean可以简单地注入另一个bean:

@Autowired

private Foo theFoo;

Spring会将新bean绑定到HTTP Session的生命周期。

9.2。将会话注入控制器

原始HTTP会话也可以直接注入Controller方法:

@RequestMapping(..)

public void fooMethod(HttpSession session) {

session.addAttribute(Constants.FOO, new Foo();

//...

Foo foo = (Foo) session.getAttribute(Constants.Foo);

}

9.3。获取会话

当前的HTTP Session也可以通过原始Servlet API以编程方式获得:

ServletRequestAttributes attr = (ServletRequestAttributes)

RequestContextHolder.currentRequestAttributes();

HttpSession session= attr.getRequest().getSession(true); // true == allow create

10.总结

在本文中,我们讨论了使用Spring Security管理Sessions。此外,Spring Reference包含一个非常好的会话管理常见问题解答。

与往常一样,本文中提供的代码可以在Github上获得。这是一个基于Maven的项目,因此它应该很容易导入和运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值