《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
Spring Security的一个常见配置就是检测相同的用户以不同的session登录安全系统。这被称为并发控制(concurrency control),是session管理(session management)一系列相关配置功能的一部分。严格来说,这个功能并不是高级配置,但是它会让很多新手感到迷惑,并且最好在你对Sping Security整体功能有所了解的基础上再掌握它。Spring Security的session管理能够以两种不同的方式进行配置——session固化保护(session fixation protection)和并发控制。因为并发控制的功能基于session固化保护所提供的框架,我们先介绍session固化。
配置session fixation防护
?既然了解了攻击如何进行,接下来我们查看SpringSecurity如何防止。
如果我们能够阻止用户在认证前和认证后使用相同的session,我们就能够让攻击者掌握的session ID信息变得没有用处。Spring Security的session固化防护解决这个问题的方式就是在用户认证之后明确创建一个新的session并将旧的session失效。
让我们看下图:
?我们可以看到一个新的过滤器,o.s.s.web.session.SessionManagementFilter,负责检查一个特定的用户是否为新认证的。如果用户是新认证的,一个配置的o.s.s.web.authentication.session.SessionAuthenticationStrategy将确定要怎样做。o.s.s.web.authentication.session.SessionAuthenticationStrategy将会创建一个新的session(如果用户已经拥有一个的话),并将已存在session的内容拷贝到新session中去。这看起来很简单,但是,通过上面的图表我们可以看到,它能够有效组织恶意用户在未知用户登录后重用session ID。
此时,你可能会想要看一下在模拟session固化攻击时会涉及到什么。为了实现这一点,你需要在dogstore-security.xml中配置session固化防护失效。
?
????????? 将sessioncookie的值复制到粘贴板上,然后登录JBCP Pets站点。如果你重复“查看Cookie信息”,你将会发现JSESSIONID在登录后没有变化,这将会导致很容易受到session固化攻击。
?? ? ? ??在Firefox下,打开JBCP Pets站点。你将会被分配一个sessioncookie,这能通过Cookie菜单的“查看Cookie信息”菜单项查看到。
?
?为了完成我们的攻击,我们点击“EditCookie”选项,并将从IE中复制到粘贴板上的JSESSIONID值粘贴进来,如下图所示:
?我们的session固化攻击完成了!如果此时在Firefox中重新加载页面,你将以IE中已登录用户相同的身份进入系统,并不需要你知道用户名和密码。你是否害怕恶意用户了?
现在,重新使session固化防护生效然后重新尝试这个练习。你会发现,在这种情况下,JSESSIONID在用户登录后会发生变化。因为你已经了解了session固化攻击是如何发生的,这意味着减少了可信任用户陷入这种攻击的风险。干的漂亮!
细心的开发人员应该会注意到有很多种窃取sessioncookie的方式,有一些如跨站脚本攻击(XSS)可能会使得session固化防护都很脆弱。请访问OWASP站点来了解更多防止这种类型攻击的信息。
比较session-fixation-protection选项将会显示以下的信息:
?尽管不很友好,但是它能够表明session已经被软件强制失效了。如果你是一个攻击者,现在你可能会很灰心。但是,如果你是一个合法的用户,你可能会很迷惑,因为这显然不是一个友好的方式来表明JBCP Pets一直关注着你的安全。
UI页面通过使用JSTL结构变得很简单了。在WEB-INF/views/account目录下,创建listActiveUsers.jsp,内容如下(简便起见,我们省略了头部和尾部信息):
?
?通过这些例子,你已经了解到了SessionRegistry的威力。我们甚至可以扩展SessionRegistry来跟踪用户活动的附加信息,如最后访问的页面、最后的行为等——这对基于Spring Security构建管理界面来说是很有用的。