我们正试图在我们的应用程序中防止会话固定攻击。这意味着我们每次用户登录应用程序时都会生成新的JSESSIONID
。
当前方案不会使用ADFS(Active Directory)生成新的JSESSIONID
后验证。因此,我们希望实现同样的目标。你能告诉我们,如何实现这种攻击的解决方案?
我们的应用程序中使用了Spring,Primefaces和Spring Security。我们尝试在Spring security.xml file
中实现以下标记。但是,使用ADFS似乎无法生成新的JSESSIONID
后验证成功。这个spring-security.xml
已添加到web.xml
中。您能否告诉我们以下使用方法有什么问题?我们在项目中使用Spring Security 3.2.10。
<sec:http create-session="always" use-expressions="true">
<sec:intercept-url pattern="/*" />
<sec:http-basic />
<sec:session-management invalid-session-url="/"
session-fixation-protection="newSession">
<sec:concurrency-control max-sessions="150"
expired-url="/" />
</sec:session-management>
<sec:csrf/>
</sec:http>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider>
<sec:user-service>
<sec:user name="abc" password="abc" authorities="ROLE_USER" />
</sec:user-service>
</sec:authentication-provider>
</sec:authentication-manager>
答案 0 :(得分:0)
如果您使用API的Basic
身份验证,则最好不要创建新会话
<sec:http create-session="stateless" ....
如果您要创建新的会话后验证,则不支持默认的Basic
过滤器,但您可以实现自己的过滤器,就像AbstractAuthenticationProcessingFilter
一样,其中有SessionAuthenticationStrategy
,SessionFixationProtectionStrategy
将在旧会话后验证中创建一个包含现有属性的新会话。
答案 1 :(得分:0)
我认为你正在使用表单登录,因为谈论用户登录.Spring包括开箱即用的会话固定保护。在SessionManagementFilter中,在doFilter方法中,您可以看到,如果用户已在当前请求中进行了身份验证,则会调用会话身份验证策略。默认情况下,此策略为SessionFixationProtectionStrategy。 显然您的配置是正确的,调试该方法并检查发生了什么。此外,如果可能的话,建议登录表单是轻量级和无会话的,因此应优先使用默认的创建会话值“IfRequired”而不是“always”。无论如何,newSession策略应该使当前会话无效,终止一个新会话并返回一个新的JSESSIONID cookie。