InfoQ

新闻

Spring MVC的安全隐患及建议

作者 Ryan Slobojan译者 张龙 发布于 2008年7月20日 上午8时27分

社区
Java
主题
Web框架,
安全
标签
Spring框架

Ounce实验室近日提出了与Spring MVC相关的两个潜在安全问题。这两个问题会影响到使用Spring MVC构建的应用,其产生的原因都与服务器端对客户端参数的处理有关。InfoQ深入分析了这两个问题并与Ounce实验室展开了一番讨论。

Ounce实验室的官方发布中这样描述这两个问题:

这些新发现的安全漏洞和一般被跨站点脚本(cross site scripting,即XSS)或SQL注入攻击利用的漏洞不同,它们并不是Spring框架内部的安全漏洞,而是应用设计上的问题。如果应用没有恰当的设计和实现,那么就有可能暴露自身的核心业务应用,并被攻击者利用。如果开发者在使用Spring框架设计和测试应用的时候头脑中能对安全问题有个清楚且正确的认识的话,企业应用在部署之后也就不会那么容易遭到攻击了。

接着,Ounce逐一剖析了这两个漏洞:

首先涉及的是数据绑定过程。Spring MVC有这样一个特性:可以直接将表单中提交的字段自动传递到代表对象模型的java beans。这个特性本身没有什么问题,但当你使用同一个bean来维护多个表单及数据(提交这些数据的表单是不同的)时问题就产生了。举个例子,比方说你有一个代表用户账户的bean,而你的web应用有两个不同的表单会更新该bean,其中一个表单用来创建新帐户,另一个用来更新已有帐户,那么攻击者就有可能“借”更新帐户的表单的“手”去修改另一个用户的帐户。第二个安全漏洞与攻击者借助用户可管理数据来控制业务流程有关。在安全领域中,人们在用户数据的验证方面投入了很到的精力,以此来防止恶意的脚本内容或者SQL注入攻击,然而如果用户可管理数据可以被用来控制业务流程的话,那么这些数据也必须通过验证。再举个例子,有一个使用Spring MVC构建的交易应用,这个应用中有三个独立的控制器:一个处理新交易请求;另一个处理交易请求验证;还有一个处理交易执行。一旦该交易流程中存在某个点,用户在这点上能操纵控制器随意将请求发送到的非既定的“视图”,那么这个业务流程就存在被扰乱的可能。如果正常交易流程被扰乱,最后执行的则会是未经验证的交易。

SpringSource的安全咨询部门也详细分析了这些问题并给出了修复这些问题的方案:

为了防止数据提交到不可编辑的字段的情况发生,我们应该在显示配置DataBinder的过程中声明允许绑定的字段,这需要设置应用中每个DataBinder实例的“allowedFields”属性。关于如何在主要的控制器实现中完成这些操作,可以参考下面这个例子:
  • SimpleFormController——覆写initBinder(HttpServletRequest, ServletRequestDataBinder)方法,并调用ServletRequestDataBinder实例的setAllowedFields(String[])方法
  • MultiActionController——在处理器的方法体中调用你创建的任何ServltRequestDataBinder实例的setAllowedFields方法
  • @Controller——使用@InitBinder注解将WebDataBinder显式注入到配置它的方法中。调用 setAllowedFields(String [])方法限制该控制器类所允许的属性。如果各个处理方法对应不同的allowedFields值的话,可以通过@InitBinder注解的方法接收 HttpServletRequest,并取消当前的请求映射
  • AbstractWizardFormController——覆写initBinder(HttpServletRequest, ServletRequestDataBinder)并调用DataBinder实例的setAllowedFields(String[])方法。调用 getCurrentPage(HttpServletRequest)方法以配置每个页面允许的属性集
为了避免ModelView注入的发生,千万不要让客户端自行选择视图。视图的选择应当由服务器端来决定。

Ounce又说他们相信其它很多框架也面临着类似的风险:

只要框架允许自动绑定或者用户可以控制应用的业务处理,那么应用都有可能存在上面提到的两个问题。我在客户编写的框架中就看到了类似的漏洞,在最近关注的一个Ruby on Rails应用中,也发现了同样的问题。产生这些问题的原因在于,设计这些框架的初衷是简化应用的开发,帮助开发者减少代码的编写量。但如果这些框架无法让简单和安全(框架默认的设置环境所保证的安全)齐头并进的话,我们最后得到的将是大量容易编写但并不安全的应用。

查看英文原文:Security Advisory Issued for Spring MVC

4 条回复

回复

只要是web应用都有这个问题 发表人 shen jianfeng 发表于 2008年7月20日 下午8时17分
Re: 只要是web应用都有这个问题 发表人 少远 姚 发表于 2008年7月20日 下午8时56分
这跟SPRING没关系 发表人 Keel Sike 发表于 2008年7月21日 下午8时29分
Re: 这跟SPRING没关系 发表人 firefly sen 发表于 2008年7月23日 下午7时24分
  1. 返回顶部

    只要是web应用都有这个问题

    2008年7月20日 下午8时17分 发表人 shen jianfeng

    拿spring来搞噱头啊

  2. 返回顶部

    Re: 只要是web应用都有这个问题

    2008年7月20日 下午8时56分 发表人 少远 姚

    web框架都或多或少有这些问题.

  3. 返回顶部

    这跟SPRING没关系

    2008年7月21日 下午8时29分 发表人 Keel Sike

    有谁不会在执行更新操作时先验证用户信息呢?
    文中所说的不过是客户端伪造表单提交的老问题。

  4. 返回顶部

    Re: 这跟SPRING没关系

    2008年7月23日 下午7时24分 发表人 firefly sen

    搞笑,这也叫问题???????蠢蛋或者没有写过程序的人才会如此设计的。

独家内容

剖析短迭代

敏捷教练Dave Nicolette提出:我们应该如何设定迭代长度?是要根据发布周期的时间么?使用短迭代又有哪些好处?

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。