通常我们会采取以下的措施来保护会话。
1.采用强算法生成Session ID
正如我们前面用Web Scrab分析的那样,会话ID必须具有随机性和不可预测性。一般来说,会话ID的长度至少为128位。下面我们就拿常见的应用服务器Tomcat来说明如何配置会话ID的长度和生成算法。
首先我们找到{TOMCAT_HOME}\conf\context.xml,然后加入下面一段设置广州网站建设
- <Manager sessionIdLength="20" ➊
- secureRandomAlgorithm="SHA1PRNG" ➋
- secureRandomClass="java.security.SecureRandom" ➌
- />
定义会话ID 的长度,如果我们这里不声明的话,默认是16字节。可能有读者会纳闷,怎么平时我看到的会话ID都是很长的呀?我们就拿这里的20个字节来讲吧,我们在浏览器发送请求时会发现这样的会话ID:
JSESSIONID=90503B6BE403D4AB6164A311E167CF1F6F3F2BD0
仔细看会发现ID的长度为40,因为这里显示的是十六进制,每两个字符代表一个字节。
定义随机数算法,默认的是SHA1PRNG,你也可以换成自己的算法。
定义随机数类,默认的是java.security.SecureRandom,我们也可以继承这个类来实现自己的算法。
有一点要注意,就是我们在实现自己的随机数算法时,一定要保证生成的Session ID不能有重复,这里我们参考一下Tomcat实现的机制。
- /**
- * Generate and return a new session identifier.
- */
- protected StringgenerateSessionId() {
- String result = null;
- do {
- if (result != null) {
- duplicates++;
- }
- result = sessionIdGenerator.generateSessionId();
- } while (sessions.containsKey(result));
- return result;
- }
由此可见,Tomcat是不会产生两个相同的会话ID的。
2.软硬兼施,会话过期
会话过期是应用程序的一项重要的安全控制,它定义了用户在多长时间段内不用重新登录而仍然维持一个登录状态。一般来说,有两种会话过期--软会话过期(Soft Session Timeout)和硬会话过期(Hard Session Timeout)。
软会话过期,它指的是用户在一定的时间内与应用系统没有交互,则会话过期。举一个简单的例子就是,一个用户登录了一个应用系统,他临时离开了计算机40分钟,而应用系统设置的会话过期时间为30分钟,这时候用户回到计算机前再做任何操作,系统都会重定向为登录页面让用户重新输入用户名和密码。
那么,软会话过期有什么用呢?我们知道在CSRF攻击中一个最基本的假设就是合法用户处在一个登录状态中,如果我们设置了一个合理的且较低的会话过期时间,就提高了实施CSRF攻击的难度,从而保护了系统。
通常有3种办法来设定软会话过期,其级别由高到低依次为:Tomcat级别> Web应用级别>Servlet运行时context级别,这时候低级别的设定会覆盖高级别的设定。
a.Tomcat级别的设定。
若你需要设定30分钟的会话过期,你可以在{TOMCAT_HOME}\conf\web.xml中进行设定如下:
- <session-config>
- <session-timeout>30</session-timeout><!-- set in minutes -->
- </session-config>
b.Web应用级别的设定。
若你需要设定15分钟的会话过期,你可以在{TOMCAT_HOME}\webapps\ {APP_NAME}\WEB-INF\web.xml中这样进行设定
- <session-config>
- <session-timeout>15</session-timeout><!-- set in minutes -->
- </session-config>
c.在程序代码中进行设定。
若你需要在程序中设定5分钟的会话过期,你可以用下面一行代码来实现:
- httpSession.setMaxInactiveInterval(5*60); // set in seconds



