写点什么

Spring MVC 的安全隐患及建议

  • 2008-07-20
  • 本文字数:1679 字

    阅读完需:约 6 分钟

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

2008-07-20 08:273674
用户头像

发布了 88 篇内容, 共 268.8 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

请别再问Spring Bean的生命周期了!

java易二三

程序员 Spring Boot 计算机 Spring Bean生命周期

想学Python高级编程?必须了解这个小技巧:match-case!

程序员晚枫

Python

代码随想录Day32 - 贪心算法(二)

jjn0703

在 Amazon EMR 上构建实时数据湖

亚马逊云科技 (Amazon Web Services)

Amazon EMR

Mac部署AIGC图片生成服务——基于stable-diffusion

珲少

Spring Boot学习路线1

小万哥

Java spring 后端 Sprint Boot Sprint Cloud

一个写了3年半flutter的小伙,突然写了2个月uniapp的感悟!

编程的平行世界

uni-app Vue 前端 Flutter Android Apk

MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)

汀丶人工智能

人工智能 自然语言处理 LoRa llama LLM模型

JVM 调优神器 arthas

java易二三

编程 计算机 Arthas

用Orange Pi Zero3定制安卓电视盒子备忘

sai

Orange Pi Android TV

2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。

福大大架构师每日一题

福大大架构师每日一题

Nginx的高可用

java易二三

编程 程序员 计算机

基于中文金融知识的 LLaMA 系微调模型的智能问答系统

汀丶人工智能

人工智能 自然语言处理 知识图谱 LoRa NLP 大模型

大厂程序员的水平比非大厂高很多嘛?

程序员小毕

Java 程序员 面试 程序人生 架构师

ChatIE:通过多轮问答问题实现实命名实体识别和关系事件的零样本信息抽取,并在NYT11-HRL等数据集上超过了全监督模型

汀丶人工智能

人工智能 自然语言处理 NLP 大模型 关系抽取 命名实体识别

代码随想录Day31 - 贪心算法(一)

jjn0703

C++中互斥锁的使用

芯动大师

Dify.AI 接入 Claude2 模型:支持 100K token 上下文,登录即免费获得 1000 次消息额度

Dify

开源 更新 LLMOps

如何在几分钟内创建一个带有业务数据的官网 AI 智能客服?

Dify

开源 AI开发 LLMOps

JVM类加载器子系统ClassLoader

java易二三

编程 程序员 计算机

使用Keepalived实现Nginx的自动重启及双主热备高可用

java易二三

编程 程序员 计算机

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

福大大架构师每日一题

福大大架构师每日一题

解决 go-zero 注册 etcd 出现 “Auto sync endpoints failed.” 的问题

非晓为骁

golang etcd go-zero etcd-client 服务注册发现

业务模块在你做之前,一定要多想呀?

Bonaparte

产品 产品经理 产品设计 产品思维 产品需求

从互联网到云时代,Apache RocketMQ 是如何演进的?

阿里巴巴云原生

Apache 阿里云 RocketMQ 云原生

Dify.AI 用户直面会:Dify 产品规划与 LLM 应用落地常见问题

Dify

开源 AI开发软件 LLMOps

懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!

Immerse

JavaScript 设计模式 代理模式 Proxy Design Pattern

Spring MVC的安全隐患及建议_Java_Ryan Slobojan_InfoQ精选文章