Spring Security 会话管理会话固定保护不起作用

Posted

技术标签:

【中文标题】Spring Security 会话管理会话固定保护不起作用【英文标题】:Spring Security session-management session-fixation-protection not working 【发布时间】:2012-05-25 03:14:03 【问题描述】:

我正在使用 Spring 3.1 安全性。以下是我的“spring-security.xml”的一部分

<session-management session-fixation-protection="migrateSession">
<concurrency-control max-sessions="1" expired-url="/Login.html"/>
</session-management>

虽然我设置了session-fixation-protection="migrateSession" 仍然如果我使用“Chrome 浏览器”登录然后复制 cookie 值并打开“Firefox 浏览器”并转到登录页面然后编辑 cookie 并从“Chrome 浏览器”粘贴值,然后我看到我已登录到我的应用程序。这意味着“会话固定攻击”是可能的!!!

我的 Spring 安全配置中是否遗漏了什么?

这只是我的以下配置文件

<http auto-config="false" access-denied-page="/" disable-url-rewriting="true">

<intercept-url pattern="/test01*" access="ROLE_USER" requires-channel="https"/>
<intercept-url pattern="/test02*" access="ROLE_USER" requires-channel="https"/>

<form-login login-page="/Login.html"/>
<logout invalidate-session="true"
        logout-success-url="/"
        logout-url="/logout"/>


<session-management session-fixation-protection="migrateSession">        
    <concurrency-control max-sessions="1" expired-url="/Login.html"/>
</session-management>

</http>

<authentication-manager>
<authentication-provider>
<user-service>    
<user name="a" password="a" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>

【问题讨论】:

Akash,你写过 UserPrincipal 和 UserPrincipalImpl 类吗? 不,我没有编写 UserPrincipal 和 UserPrincipalImpl 类。 发布您的部分代码,以便我们为您提供帮助 正如我在下面所说的,你应该只有一个 &lt;session-management&gt; 元素,但这是另一个问题。 【参考方案1】:

如果您在登录后复制了cookie(如您所说),那么这不是会话固定攻击(至少不是我们所防范的那种)。关键是当您登录时 cookie 会发生变化,因此其他人无法访问您的帐户。如果您想阻止某人修复已登录到其帐户的会话,那么这是另一回事,并且不能通过这种方式轻松保护。

此外,您不需要设置此属性,因为它默认启用。并且只需使用一个 &lt;session-management&gt; 元素。

【讨论】:

您好,感谢您的回复。我正在查看 Peter Mularien 的“Spring Security 3”一书。在这本书“第 6 章”第 173 页中,他执行了“模拟会话固定攻击”。我只是做了和他一样的事(我在我的帖子中解释过)。但他说他的一个正在工作,但我自己的项目没有工作:( 再读一遍 - “将会话 cookie 值复制到剪贴板,然后登录”......他从 Internet Explorer 登录之前复制了 cookie。你说你登录然后复制cookie。只需检查登录时会话cookie是否发生变化。 :D 卢克你是对的。它正在改变。非常感谢。但是有什么办法可以防止登录后复制过去的cookie。 没有。但这不是现实的攻击。当您登录时,您不应该允许其他人访问您浏览器的 cookie 列表。并且您应该使用 HTTPS 来保护通过网络传输的会话 cookie。【参考方案2】:

这是因为您提供了session-fixation-protection="migrateSession"。即来自 Chrome 浏览器的会话被复制到 Firefox 浏览器的会话中。此外,它不应该同时登录第二次。这可能是因为,如果您提供了自己的 UserPrincipalUserPrincipalImpl 类,则必须覆盖 Object 的 equals()hashCode() 方法。尝试让并发控制工作。

另请参阅my question。

【讨论】:

您好,感谢您的回复。我检查了您在同一时间一个用户登录时遇到并发控制问题的线程。但这不是我的问题。这个对我有用。我的问题是会话固定保护,即使我设置“newSession”仍然有同样的问题。可以复制过去的cookie,它可以在另一个浏览器中工作:( @Akash。不,那不是会话固定攻击。两个会话不同,新会话迁移到旧会话。您登录了两次,而您应该只能登录一次。所以问题在于会话的并发 请查看我完整的 spring-config 文件代码。我还需要做什么来防止这种情况发生。顺便说一句,我尝试使用来自不同浏览器的相同用户帐户登录。第二次登录时,第一个消失了。然后只有第二次尝试处于活动状态。但是当登录后复制过去的cookie时,可以在不同的浏览器中成为同一用户:(

以上是关于Spring Security 会话管理会话固定保护不起作用的主要内容,如果未能解决你的问题,请参考以下文章

spring boot整合 spring security之会话管理

如何使用 Spring Security 管理 Spring Boot 中的会话?

使用 Spring Security 进行会话管理

带有会话 Cookie 的 Spring Security RememberMe 服务

如何从 Spring Security 中的会话管理(超时/并发检查)中排除某些页面?

Spring Security —— 会话管理