今天,双十二电商大战又开始了!但是,在表面风平浪静的电商中,却暗流涌动。这不,又有人出来搞事情啦!昨天网传京东被曝出了多达12G的用户数据在黑市流通,其中包括用户名、密码、邮箱、QQ号、电话号码、身份证等多个维度,数据多达数上千万条!后经证实,泄漏数据的罪魁祸首竟然是Struts!今天,小编就充当一回小记者,给大家讲一下Struts到底为何物?

Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

Struts是对JSPModel2设计标准的一种实现,下面分别从模型(Model)、视图(view)和控制器3个部分介绍Struts的体系结构和工作原理。调用流程如下所示(图1.1)。

京东数据泄漏,原来是Struts惹得祸!

(1)视图(view)

在Struts中,视图层包含两个部分,JSP页面和ActionForm。

ActionForm封装了用户提交的表单信息,其实ActonForm本质上就是JavaBean,这些JavaBean中没有业务逻辑,只提供了所有属性的getter和setter方法,这些属性和用户表单中的输入项是一一对应的。在Struts中就是通过ActionForm把用户表单信息提交给控制器。

JSP页面是经典MVC中主要的视图组件,主要是信息显示和控制器处理结果显示的功能。

除了以上,struts还提供了一个强大的struts标签库,来帮助用户解决显示逻辑,并且利用ActonForm组件将信息传递到控制层。

(2)控制器(Controller)

在控制层,struts提供了一个控制器组件ActionServlet,它继承自HttpServlet,并重载了HttpServlet的doGet(),doPost()方法,可以接受HTTP的响应,并进行转发,同时还提供了使用XML进行转发Mapping(映射)的功能。

(3)模型(Model)

模型表示状态和业务逻辑的处理,在一般的web应用程序中,用JavaBean或者EJB来实现系统的业务逻辑。在Struts中,struts提供Action对象,来管理业务逻辑的调用,帮助用户分离业务逻辑,也就是说struts本身不实现业务逻辑,但可以调用已完成的业务逻辑。

Struts工作流程如下(图1.2)所示。

京东数据泄漏,原来是Struts惹得祸!

ActionServlet是struts中核心的控制器,所有的用户请求都必须通过ActionServlet的处理,而struts-config.xml是struts中核心的配置文件,在这个文件中配置了用户请求URL和控制器Action的映射关系,ActionServlet通过这个配置文件把用户的请求发送到对应的控制器中。

在struts web应用程序中,当web应用程序启动的时候,就会初始化ActionServlet在初始化ActionServlet的时候会加载struts-config.xml配置文件,在加载成功后会把这些URL和控制器映射关系存放在ActionMapping对象或者其他对象中。当ActionServlet接收到用户请求的时候,就会按照下面的流程对用户请求进行处理。

(1)ActionServlet接收到用户的请求后,会根据请求URL寻找匹配的ActionMapping对象,如果匹配失败,说明用户请求的URL路径信息有误,所以返回请求路径无效的信息,当找到匹配的ActionMapping的时候,进入到下一步。

(2)当ActionServlet找到匹配的ActionMapping对象的时候,会根据ActionMapping中的映射信息判断对应的ActionForm对象是否存在,如果不存在对应的ActionForm对象就创建一个新的ActionForm对应,并把用户提交的表单信息保存到这个ActionForm对象中。

(3)在struts-config.xml中这个配置文件,可以配置表单是否需要验证,如果需要验证,就调用ActionForm中的validate()方法对用户输入的表单进行验证。

(4)如果ActionForm的validate()方法返回了ActionErrors对象,则表明验证失败,ActionServlet把这个页面返回到用户输入的界面,提示用户重新输入。如果方法的返回值为null,就表明验证已经通过,可以进入下一步处理。

(5)ActionServlet可以根据ActionMapping对象查找用户请求转发给哪个控制器Action,如果对应的Action对象不存在,就创建这个对象,并调用这个Action的excute()方法。

(6)业务逻辑控制器Action的execute()方法就会返回一个ActionForward对象,ActionServlet把控制器处理的结果转发到ActionForward对象指定的JSP页面。

(7)ActionForward对象指定的JSP页面根据返回的处理结果,用合适形式把服务器处理的结果展示给用户,到这里为止,一个客户请求的整个过程完毕。

Struts是一个开源项目,广泛应用于大型互联网企业、政府、金融机构等网站建设,并作为网站开发的底层模板使用。可是再优秀的大型的操作系统软件或者是数据库软件,都难以避免地存在不同程度的bug或者安全漏洞。当一些网络高手或者是安全组织,发现安全漏洞之后,通常会发出漏洞安全警示,来提醒系统厂商或者软件厂商进行漏洞修补。但在2013年7月,Apache基金会旗下的Struts,在发现了一处安全漏洞之后并没有像行业通行的发出漏洞警告,而是非常轻率和儿戏地放出了该漏洞的源代码,这就相当于把网络安全的病灶公之于众,即便水平低下的黑客也能知道网络防御的软肋,这使得很多技术很普通的的黑客,也能利用Struts 2安全漏洞相对轻松地获取网络上的各类数据。

其实,京东数据泄露事件,目前来看真正受到影响的用户还非常有限,京东的处置也很高效透明,但Struts 2这类的安全漏洞事件可能为整个中国互联网产业发展埋下了很多地雷,这需要用雷霆手段来对抗。打击数据偷窃、交易和消费的网络黑产业已迫在眉睫,这既需要全社会、全行业握紧铁拳打击,也需要每一个互联网的使用者提高信息安全危机意识和防范水准,让不法分子以易乘之机。