原文链接。
一个略懂HTML的朋友告诉我,他在使用公司OA系统时,用Chrome在表单页面上做了点小改动,然后点了保存按钮,本来不能修改的数据竟然修改并保存到数据库里去了,软件真的这么脆弱吗?我看了一下他们的系统,是一个BS架构的企业软件,这个表单的局部类似下面这个样子:
可以看到类型这个下拉框是不可编辑的,在Chrome里按下F12可以看到对应的HTML代码是这样的:
<select id="amountType" name="amountType" disabled="true">
<option value="1" selected>小额</option>
<option value="2">大额</option>
</select>
在Chrom里很容易把它修改成这样:
<select id="amountType" name="amountType" disabled="true">
<option value="1">小额</option>
<option value="2" selected>大额</option>
</select>
disabled这个属性是修改不了的,如果是一般的表单提交,disabled的控件的值不会提交多服务器,但在这个程序里也不需要修改,点击保存按钮后,JS把表单数据序列化为JSON(包含了amoutType这个下拉框的值),然后用ajax提交了。其实,即使是常规的表单提交也不是没有办法,在Chrome里可以先从DOM里删除select这个下拉框,然后在控制台里输入:
document.forms[0].appendChild(document.createElement('input')
页面上会多出一个input输入框来,然后再给它添加几个属性就好了:
<input id="amountType" name="amountType" value="2">
这样的效果是一样的。
像Chrome和FireFox(安装了FireBug)这样的浏览器只要按下F12后,修改HTML就非常容易,但是浏览器里的F12并不是让程序变得脆弱的关键原因,它只是让破坏程序编的更加容易了。即使没有它,不也可以用HTTPClient发出想要的任何请求吗?罪魁祸首是服务器端的程序漏洞。虽然我们无法看到这个OA系统的服务器端代码,但是也可以猜个大概:
比如客户端提交的JSON数据,一般的MVC框架(比如Spring MVC)会把它照单全收转化为一个模型对象(比如一个JPA的实体对象),然后ORM会把这个模型对象的全部属性照单全收地保存到数据库中。
问题就出在两个“照单全收”上。其实在Rails这样的框架里早就有提供了update_attributes这样的方法处理这个问题,但是这样需要额外的编码控制,这会增加工作量,尤其是对于页面和功能很多的企业应用软件,精细地控制这两个环节的成本还是很高的,再加上企业应用软件在内网运行用户也不多,钻漏洞的人也少,所以这个问题也不被重视。总之,由于侥幸、偷懒或为了减少开发工作量,很多企业应用的软件都存在这个问题。
当我和其他开发者交流这个问题的时候,他们大都认同这样的漏洞在BS软件里大量存在,但是也大都认为不主动增加工作量控制两个“照单全收”是没有办法的。某种程度上这是对的。
但是换一种架构也许就不一样了,确有一些架构不用做多余的处理就可以避免这个问题。比如状态保存在服务器端的那些MVC框架,当然我并不认为这是目前最好的架构方案,这里只针对这一个问题来说明这种不怎么RESTFUL的框架如何使用更少的工作量实现更高的安全性。下面以JSF为例来说明。
在JSF中一个页面对应一颗组件树,它保存在服务器端,每个组件有自己的属性,HTTP请求数据到来时,更新各个组件的value属性,然后,组件的value值再更新到Model对象里,最终Model会被保存到数据库中。如果一个组件(比如图中的selectOneMenu)的属性是disabled的,JSF框架是不会用HTTP中的数据更新这个组件的value属性的。由于组件树上的组件是在服务器端(根据一个服务器端的xhtml模板文件)创建和维护的,客户端几乎是无法改变它的(只有服务器端的Java代码可以把图中的那个selectOneMenu改为非disabled),这样就避免了Model被HTTP数据非法污染。当然,这样也有不好的地方,服务器端需要消耗更多的资源。
最后想说的是如果您看到了这篇文章,不要用这个方法在任何正式的系统上去试验,文章的目的是让更多的开发者避免这样的漏洞出现,当然文章开头提到的那位朋友也是虚构的。
分享到:
相关推荐
"BS软件页面模板"是指基于Browser/Server(浏览器/服务器)架构的网页设计模板,它主要用于构建Web应用程序的用户界面。这种类型的模板通常包括一系列预设计的HTML、CSS和JavaScript文件,可以快速搭建出响应式且...
《BS-5000G花样机打版软件:深入解析与应用指南》 BS-5000G是一款专为电脑花样机设计的打版软件,它在缝纫行业中扮演着至关重要的角色,帮助设计师将创意转化为精确的缝纫图案。这款软件支持BMP和JPG两种图像格式,...
BS管理软件界面,全称为Browser/Server,即浏览器/服务器模式,是一种基于Web技术的软件架构模式。在这样的系统中,用户通过Web浏览器与服务器进行交互,而服务器负责处理业务逻辑和数据存储。这种模式在信息化建设...
《BS-300&320工程维护软件:系统管理与优化的得力助手》 在信息技术领域,工程维护软件扮演着至关重要的角色,它能够有效地管理和优化各种硬件设备和系统,确保其稳定运行。BS-300&320工程维护软件就是这样一个专门...
主流软件开发技术,包括原型法、BS/CS结构、基于构件的软件开发法以及软件复用,各自针对不同的开发场景和需求提供了有效的解决方案。原型法强调快速迭代与用户反馈,适用于需求不确定或变化较快的项目;BS/CS结构的...
BS软件开发.pdf
在BS架构软件的原型设计中,有几个关键知识点是至关重要的。首先,UE(User Experience,用户体验)调研是软件设计的基石,它涉及到对用户界面(UI)和交互设计的深入理解。在项目调研与原型设计之间进行UE调研,...
**基于BS架构的软件项目实训-JSP-丁旭-ppt** 在信息技术领域,BS(Browser/Server,浏览器/服务器)架构是一种广泛应用于Web应用程序的设计模式。这种架构将应用的业务逻辑、数据处理和用户界面分离开来,使得系统...
"BS软件管理后台界面PSD" 是一种设计资源,它主要用于创建高效、直观且美观的后台管理系统界面。这里的“BS”通常指的是“Browser/Server”,即浏览器/服务器架构,这意味着这种后台界面设计是基于Web的,用户可以...
在当前的软件应用系统中,BS结构正变得越来越流行,很多软件公司都在使用BS结构来开发自己的应用系统。微软的.NET架构就是基于BS结构的,JAVA技术也已经很成熟的应用了BS结构。BS结构的出现使得软件应用系统的发展...
BS架构和CS架构是两种常见的软件系统架构,分别代表浏览器/服务器架构和客户机/服务器架构。以下是对BS和CS架构的详细介绍。 BS架构(Browser/Server架构) BS架构是一种基于浏览器和服务器的架构,用户通过WWW...
它通过集成化的管理工具,使设备维护变得更加便捷、精准,为医疗机构提供了可靠的设备保障,进而提升了医疗服务的整体水平。在日常使用中,合理利用这款软件,不仅可以延长设备使用寿命,还能减少因设备故障导致的...
BS-8004录像机软件是针对邦视监控系统设计的一款专业软件,主要用于管理和记录监控设备捕捉到的视频数据。这款软件集成了多种功能,包括视频录制、回放、实时监控以及远程访问等,旨在为用户提供高效且安全的监控...
标题中的“BS9000 烧录软件,PC端”指的是一个专门针对比亚迪汽车MCU(微控制器)的编程和烧录工具,它在个人计算机上运行,用于对比亚迪汽车上的嵌入式硬件进行固件更新或初始编程。在汽车电子系统中,MCU是核心...
BS 医院管理软件 HIS 1 客户端不用安装软件:用了BS结构,在浏览器中打开程序运行操作(不是网页,C语言做的程序)。 2 运行反应速度快:用C语言制作了客户端控件自动下使用,速度快、功能强大。 3 操作简单:使用...
《考试系统(纯BS结构软件V2021版本)详解》 在信息化教育日益普及的今天,一款高效、便捷的考试系统对于教学管理和学生学习起着至关重要的作用。"考试系统(纯BS结构软件V2021版本)"正是这样一款专为在线教育设计...
此软件可以把cs程序转换成bs的,在压缩包里有使用说明,按照说明操作。本程序转换的bs是asp.net的,需要运行于iis和.net框架。
CS(Client/Server)结构和BS(Browser/Server)结构是两种主要的软件系统架构,它们主要用于构建分布式应用程序,特别是在企业级应用中广泛使用。 **CS结构**是客户端/服务器结构,这种架构下,客户端(Client)...
开发BS软件中常用到 JavaScript 代码,开发BS软件中常用到 JavaScript 代码,开发BS软件中常用到 JavaScript 代码