【IT168 评论】Tomcat的7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们,或指出它们的不足,或提供代码示例。本文将明确描述TOMCAT 7中七个最显著的特征和新增的功能,并对其作出评论,而不是仅仅列出新的功能。本文还提供了代码例子以方便你可以对其有更好的理解。
本文分为两个部分,分别是”TOMCAT 7的新特性”和“TOMCAT 7增强的功能“。
TOMCAT 7新特性
1 使用随机数去防止跨站脚本攻击。
2 改变了安全认证中的jessionid的机制,防止session攻击。
3 内存泄露的侦测和防止
4 在war文件外使用别名去存储静态内容。
TOMCAT 7的增强功能
5 对Servlet 3.0,JSP 2.2和JSP-EL 2。2的支持
6 更容易将Tomcat内嵌到应用去中去,比如JBoss
7 异步日志记录
根据Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,内存检测泄露和增强的安全特性。
Tomcat 7的例子程序中,包含了Eclipse的工程文件和Ant的构建文件,以方便去构建war文件。其中Eclipse工程文件有例子代码描述了Tomcat 7的一些新特性。
下面逐一开始介绍。
TOMCAT 7新特性
1使用随机数去防止跨站请求伪造攻击。
Wikipedia将跨站请求伪造攻击(Cross Site Request forgery,CSRF)定义为:“一种影响Web应用的恶意攻击。CSRF让用户当进入一个可信任的网页时,被强行执行恶意代码。
经典的防止CSRF攻击的方法是使用随机数的方式,Wikipedia中定义为“利用随机或伪随机数嵌入到认证协议中,以确保旧的不能在以后的重放攻击中被利用。”
Tomcat 7中有一个servlet过滤器,用于将随机数存储在用户每次请求处理后的seesion会话中。这个随机数,必须作为每次请求中的一个参数。 Servlet过滤器然后检查在请求中的这个随机数是否与存储在用户session中的随机数是一样的。如果它们是相同的,该请求是判断来自指定的网站。如果它们是不同的,该请求被认为是从其他网站发出并且会被拒绝。
这个servlet过滤器是十分简单的,下面是从TOMCAT 源代码CsrfPreventionFilter文档中摘录的片段:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);
String expectedNonce = (String) req.getSession(true).getAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME);
if (expectedNonce != null && !expectedNonce.equals(previousNonce)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
String newNonce = generateNonce();
req.getSession(true).setAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME, newNonce);
所以每个URL地址中都有一个从用户session中提取的随机数,下面是使用的JSTL例子:
在以前,JSTL中构造链接可以这样:
< c:param name="id" value="0" / >
< /c:url >
< a href="${show}" >Show< /a >
而现在可以这样:
< c:param name="id" value="0" / >
< c:param name="org.apache.catalina.filters.CSRF_NONCE" value="${session.org.apache.catalina.filters.CSRF_NONCE}" / >
< /c:url >
具体的例子可以参考TOMCAT 7自带例子中的演示,这个过滤器可以在web.xml中进行配置,配置后,所有访问如http://localhost:8080/tomcat7demo/csrf/的都必须带上参数,不带上参数的话会出现403禁止访问错误。
当然这种方法的缺点就是所有的链接都必须带上这个随机数。