`
kavy
  • 浏览: 891107 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

网站安全之——tomcat新特性

    博客分类:
  • web
 
阅读更多

http://itlab.idcquan.com/Java/Tomcat/909396.html

Tomcat 7 的七大新特性

 

 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文档中摘录的片段:

    Java代码:

    public class CsrfPreventionFilter extends FilterBase {

    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:url var=“url” value=“/show” >

    < c:param name=“id” value=“0” / >

    < /c:url >

    < a href=“${show}” >Show< /a >

    而现在可以这样:

    < c:url var=“url” value=“/show” >

    < 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中进行配置,配置后,所有访问的都必须带上参数,不带上参数的话会出现403禁止访问错误.

    当然这种方法的缺点就是所有的链接都必须带上这个随机数.

    2. 改变了安全认证中的jessionid的机制,防止session攻击.

    Session劫持攻击通常是以下的情况:

    1 恶意攻击者先访问一个网页,由于cookie是以jsession id的方式存储在浏览器中的,即使攻击者不登陆,他可以伪造一个带有jsession id的地址,把它发给受害者,

    2 受害者点这个带有jsessionid的链接,提示输入验证信息之后就登陆系统;

    3 攻击者现在使用这个带jsessionid的链接,以受害者的身份登陆进系统了.

    对于攻击者来说,将jsessionid加在url中以及通过一个恶意表单发送出去是很容易的事,对于session劫持攻击的更详细描述,请参考Acros Security组织的白皮书“Session Fixation Vulnerability in Web-based Applications”.

    Tomcat 7对此的解决方案是一个补丁,它在验证后改变了jsessionid.这个补丁主要是应用在Tomcat 7中,当然在Tomcat 5和6中也可以使用但只是有些不同.

    根据Mark Thomas说的,应用了Tomcat 7的这个补丁后:

    Tomcat默认情况下安全性不再变得脆弱,因为验证后会话发生了变化

    如果用户改变了默认设置(比如应用程序不能处理变化了的session id),风险也会降到最小,因为在Servlet 3中,可以禁止在url中进行会话跟踪.

    而在Tomcat 5和Tomcat 6中,应用了补丁后:

    能阻止session劫持攻击,因为能让Tomcat在验证后改变session id.

    如果应用程序不能处理变化了的session id,可以通过写自定义的过滤器去检查request.isRequestedSessionIdFromURL()和其返回的结果,以降低风险.

    以上这些改变都是Tomcat在幕后所做的,开发者根本不用去理会.

    3. 内存泄露的侦测和防止

    开发者在部署他们写的程序到生产环境上时,经常会遇到Pemgen错误:OutOfMemoryError.这是由于内存泄露而引起的.通常开发者是通过增大permgen内存的大小去解决或者就是重新启动Tomcat.

 

    Tomcat 7包含了一个新的特性,它通过把不能垃圾回收的引用对象移走的方法,能解决一些Permgen内存泄露的问题.这个特性对程序员部署应用程序在他们的开发环境中是十分方便的,因为程序员在开发环境中为了节省时间一般不重新启动Tomcat就能部署新的war文件.在生产环境中,最好的建议还是停掉Tomcat,然后清除work下面的目录文件并且重新部署应用.

当然,内存泄露检测和防止这个特性现在还不是很完善,还是有的情况Tomcat不能检测内存泄露和修复之的,所以对于生产环境,最好的的办法还是停掉Tomcat,然后清除work下面的目录文件并且重新部署应用.

    Mark Thomas解析应用程序或者库程序在如下情况下会触发内存泄露:

    JDBC驱动的注册

    一些日志框架

    在ThreadLocals中保存了对象但没有删除它们

    启动了线程但没停止

    而 Java API 存在内存泄漏的地方包括:

    1.使用 javax.imageio API ( Google Web Toolkit会用到)

    2.使用 java.beans.Introspector.flushCaches()

    3.使用 XML 解析器

    4.使用 RMI 远程方法调用

    5.从 Jar 文件中读取资源

    4. 在war文件外使用别名去存储静态内容

    Web应用程序需要静态资源文件,比如象CSS,Javascript和视频文件、图片文件等.通常都把它们打包放在war文件中,这将增加了WAR文件的大小并且导致很多重复的加载静态资源.一个比较好的解决方法是使用Apache HTTP服务器去管理这些静态文件资源,下面是一个apache httpd.conf文件的配置摘录:

    < Directory “/home/avneet/temp/static” >

    Order allow,deny

    Allow from all

    < /Directory >

    Alias /static “/home/avneet/temp/static”

    以上的设置,使得访问localhost/static时,能访问到放在/home/avneet/temp/static下的资源.

    允许使用新的aliases属性,指出静态文件资源的位置,可以通过使用Classloader.getResourceAsStream('/static/...')或者在链接中嵌入的方法让Tomcat去解析绝对路径,下面是一个在context.xml中配置的例子:

    < ?xml version=“1.0” encoding=“UTF-8”? >

    < Context path=“/Tomcat7demo” aliases=“/static=/home/avneet/temp/static” >

    < /Context >

    假设/home/avneet/temp/static这个文件夹存放有一张图片bg.png,如果war文件以Tomcat7demo的名字部署,那么可以通过以下三个方式去访问这张图片

    1.直接访问 localhost:8080/Tomcat7demo/static/bg.png

    2.在HTML链接中访问:< img src=“/Tomcat7demo/static/bg.png” / >

    3.通过JAVA代码访问: ByteArrayInputStream bais = (ByteArrayInputStream)getServletContext().getResourceAsStream(“/static/bg.png”);

    使用aliases的好处是可以代替Apache的httpd.conf的设置,并且可以在servlet容器范围内访问,并且不需要Apache.

    Tomcat 7的增强特性

    5. 对Servlet 3.0,JSP 2.2和JSP-EL 2.2的支持

    Servlet 3的增强特性有:

    可以在POJO或者过滤器filters中使用annotations注释(在web.xml中不再需要再进行设置了)

    可以将web.xml分块进行管理了.也就是说,用户可以编写多个xml文件,而最终在web.xml中组装它们,这将大大降低web.xml的复杂性增强可读性.比如, struts.jar和spring-mvc.jar每一个都可以有一个web-fragment.xml.开发者不再需要在web.xml中去配置它们了,在web-fragment.xml中的jar文件会自动加载,并且struts/spring-mvc servlets和filters也会自动装配设置.

    异步处理web的请求----这个特性在Tomcat 6 中已经有了,现在在Tomcat 7中以Servlet 3标准规范化了,能让使用异步I/O的web应用程序可以移植到不同的web容器中.异步处理使用非阻塞I/O,每次的HTTP连接都不需要对应一个线程.更少的线程可以为更多的连接提供服务.这对于需要长时间计算处理才能返回结果的情景来说是很有用的,比如产生报表,Web Servce调用等.

    安全的增强---Servlet 3.0现在使用SSL 去加强了会话session的跟踪,代替了原来的cookie和URL重写.

    6. 更容易将Tomcat内嵌到应用去中去

    Tomcat 7现在可以嵌入到应用程序中去,并可以通过程序去动态设置和启动.象在CATALINA_HOME/conf/server.xml中的很多配置,现在都可以用程序动态去设置了.在Tomcat 7前,Tomcat 6提供了一个嵌入类,它能方便地去配置Tomcat.但在Tomcat 7中,这个类已被废弃了.这个新的Tomcat 7的类,使用了几个默认的配置元素,并提供了一个更容易和简单的方法去嵌入Tomcat.

    下面是CATALINA_HOME/conf/server.xml中的一些相关属性和配置:

    < Server >

    < Service >

    < Connector port=“8080 >

    < Engine >

    < Host appBase=”/home/avneet/work/Tomcat7demo/dist“ / >

    < /Engine >

    < /Connector >

    < /Service >

    < /Server >

    我们可以通过程序去进行动态设置了:

    final String CATALINA_HOME = ”/home/avneet/work/temp/Tomcat7demo/“;

    Tomcat Tomcat = new Tomcat();

    Tomcat.setBaseDir( CATALINA_HOME );

    Tomcat.setPort( 8080 );

    Tomcat.addWebapp(”/Tomcat7demo“, CATALINA_HOME + ”/webapps/Tomcat7demo.war“);

    Tomcat.start();

    System.out.println(”Started Tomcat“);

    Tomcat.getServer().await(); //Keeps Tomcat running until it is shut down

    //Webapp Tomcat7demo accessible at localhost:8080/Tomcat7demo/

    7. 异步日志记录

    Tomcat 7现在包括了一个异步日志记录器(AsyncFileHandler).AsyncFileHandler继承了FileHandler类并能代替FileHandler.使用AsyncFileHandler,时,只需要在CATALINA_HOME/conf/logging.properties中把FileHandler全部替换为AsyncFileHandler就可以了.要注意的是异步日志不能跟log4一起工作.

    当有日志发向AsyncFileHandler时,日志被加入到队列中(java.util.concurrent.LinkedBlockingDeque)并且方法调用的信息会马上返回不需要等待I/O写到磁盘中.当类加载器加载AsyncFileHandler时,会有一个单独的线程启动,这个线程会从队列中读取日志信息并且写到磁盘中去.

    这种方法的好处是如果I/O速度很慢(比如日志要保存在远端的设备上)时,记录日志的请求和处理过程不会显得很慢.

    AsyncFileHandler使用生产者和消费者的关系原理,在队列中存储日志信息.队列默认大小为10000.为了预防队列溢出,默认是丢弃最后的信息.默认的队列大小和溢出的设置都可以通过启动参数进行设置.

    关于Tomcat 7的示例程序

 

    Tomcat 7的自带程序例子有两个servlets,一个是演示了如何采用随机数的办法防止CSRF攻击,另外一个是描述了使用aliases.更新一下web/META-INF/context.xml,指出图片的绝对路径即可顺利运行.

 

 

分享到:
评论

相关推荐

    绿色——TOMCAT 6.0

    【绿色——TOMCAT 6.0】 TOMCAT 6.0是一款广泛使用的开源Java Servlet容器,由Apache软件基金会的Tomcat项目开发并维护。它遵循Java EE规范,特别是Servlet和JSP标准,为开发者提供了轻量级的Web应用程序托管环境。...

    tomcat 7 网站开发工具

    此外,Tomcat的管理界面——Tomcat Manager和Host Manager,可以帮助开发者在线部署、更新或移除应用,以及查看服务器状态。对于更复杂的项目,开发者可能还需要配置连接池、安全管理器、虚拟主机等高级特性,以满足...

    最新版linux apache-tomcat-8.5.70.tar.gz

    在本例中,我们讨论的是针对Linux操作系统的最新版本——Apache Tomcat 8.5.70。 Apache Tomcat 8.5是Tomcat的第八个主要版本,它引入了许多性能优化和新特性。版本号中的70代表这是8.5系列中的第70个小版本,通常...

    tomcat6.0and7.0version

    此压缩包包含了Tomcat的两个主要版本——Tomcat 6.0和7.0,这两个版本在Java Web开发领域都有着重要的地位。 Tomcat 6.0是Tomcat的一个里程碑版本,它主要基于Servlet 2.5和JSP 2.1规范。这个版本引入了许多新特性...

    tomcat免费开源服务器

    5. **安全特性**:Tomcat支持多种安全机制,如SSL/TLS加密、角色基础的访问控制以及Form认证等,确保Web应用的安全性。 **安装与运行** 在Windows、Linux或Mac OS等操作系统上,Tomcat的安装通常涉及解压下载的...

    tomcat的linux的7 8 9版本汇总

    这个压缩包包含了Tomcat在Linux环境下的三个主要版本——7、8和9,为用户提供了多种选择,可以根据项目需求选择合适的版本进行部署。 【描述】提到的"合集"意味着这个压缩包提供了全面的Tomcat版本,用户可以根据...

    最新版windows apache-tomcat-10.0.0-M9-windows-x64.zip

    3. **修改配置文件**:在Tomcat的conf目录下,有两个关键配置文件需要关注——`server.xml`和`tomcat-users.xml`。`server.xml`用于配置服务器端口、Web应用目录等;`tomcat-users.xml`则用来设置管理用户的用户名和...

    tomcate 6与7 for linux

    标题"tomcat 6与7 for linux"表明了本文将讨论的是在Linux操作系统环境下使用的Tomcat服务器的两个主要版本——Tomcat 6和Tomcat 7。Tomcat是一款开源的Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和...

    计算机毕业论文——个人博客网站设计

    - **安全性:**内置的安全特性,如角色权限管理和加密技术,保障了数据的安全。 - **易用性:**提供了图形化的管理工具和丰富的API接口,方便开发者进行数据库操作。 ##### 2.2 开发环境介绍 ###### 2.2.1 ...

    tomcat整理

    - 对于Windows用户,还有一个特殊的选项——"Windows Service Installer",它允许将Tomcat作为Windows服务进行安装和管理。不过,如果你只是个人开发或测试用途,通常`.zip`格式就足够了。 2. **安装Tomcat** - ...

    暨大学子的毕业设计——基于vue和springboot的光电论坛网站,前后端分离——后端.zip

    SpringBoot的核心特性包括自动配置、内嵌Web服务器(如Tomcat)以及“起步依赖”等,使得开发者能够快速启动和运行一个完整的Java应用。 在SpringBoot中,我们通常会创建一个主配置类,用`@SpringBootApplication`...

    tomcat 7应用包

    关于“标签”中的“tomcat7”,这强调了我们讨论的是Tomcat的特定版本——7.0.x系列。这个版本引入了许多改进和新特性,例如支持Servlet 3.0规范,提供更好的并发处理能力,增强了管理工具,以及对JSP 2.2和EL 2.2的...

    apache-tomcat-9.0.37.7z

    **二、Tomcat 9.0.37新特性** 1. **性能提升**:此版本对内部代码进行了优化,提升了处理HTTP请求的效率,减少了内存消耗。 2. **安全性增强**:修复了多个安全漏洞,确保了服务器的安全运行,降低了被攻击的风险。 ...

    Eclipse5.5、Tomcat 5.5、SQLServer 2005 开发JSP网站 企业宣传网站:品红

    在本项目中,我们使用了Eclipse 5.5、Tomcat 5.5和SQL Server 2005这三款工具来开发一个企业宣传网站——“品红”。这个项目旨在展示如何利用这些技术构建一个高效且具有吸引力的在线平台,以推广企业形象和产品服务...

    tomcat-6.0.20

    Tomcat 6.0.20 版本的关键特性包括: 1. **Servlet 2.5支持**:Tomcat 6.x系列支持Servlet 2.5规范,这是Java Web开发的重要部分,提供了处理HTTP请求的方法和生命周期管理。 2. **JSP 2.1支持**:此版本同样支持...

    Glassfish关于tomcat的文档

    尽管Tomcat以其轻量级、易用性以及开源特性赢得了广泛的应用,但对于那些寻求更高层次功能和服务支持的应用开发者来说,GlassFish提供了一个更强大、更稳定且具有更多企业级特性的选择。无论是从性能、安全性还是...

    中间件——WEB服务器软件.docx

    Apache HTTP Server,通常简称为Apache,是全球最广泛使用的网络服务器软件之一,以其开源、跨平台和安全性著称。这款服务器软件能够在几乎所有的操作系统上运行,包括但不限于各种Unix变种和Linux发行版,以及...

    Java毕业设计——基于spring boot的在线招标网站设计与实现(源码+数据库).7z

    Spring Boot提供了内置的Tomcat服务器,自动配置Spring框架,以及对许多常用库的默认依赖,如数据访问、安全、缓存等。在这个招标网站中,Spring Boot可能被用来处理HTTP请求、管理服务层的bean、以及实现微服务架构...

    JSP源码——中帆智能建站系统基础版JSP版_basic3.zip

    综上所述,"JSP源码——中帆智能建站系统基础版JSP版_basic3.zip"是一个全面的建站解决方案,它融合了JSP技术的诸多特性,提供了丰富的功能,帮助用户快速构建高效、安全的企业政府类网站。通过深入学习和理解其中的...

    tomcat结合nginx使用小结.pdf

    随着互联网技术的发展与进步,Web服务器的选择和配置成为了确保网站稳定运行的关键因素之一。其中,Apache与IIS作为传统Web服务器领域的佼佼者,曾经占据着市场的主要份额。然而近年来,一款名为Nginx的轻量级高性能...

Global site tag (gtag.js) - Google Analytics