京東數(shù)據(jù)泄漏,原來(lái)是Struts惹得禍!

今天,雙十二電商大戰(zhàn)又開(kāi)始了!但是,在表面風(fēng)平浪靜的電商中,卻暗流涌動(dòng)。這不,又有人出來(lái)搞事情啦!昨天網(wǎng)傳京東被曝出了多達(dá)12G的用戶數(shù)據(jù)在黑市流通,其中包括用戶名、密碼、郵箱、QQ號(hào)、電話號(hào)碼、身份證等多個(gè)維度,數(shù)據(jù)多達(dá)數(shù)上千萬(wàn)條!后經(jīng)證實(shí),泄漏數(shù)據(jù)的罪魁禍?zhǔn)拙谷皇荢truts!今天,小編就充當(dāng)一回小記者,給大家講一下Struts到底為何物?

Struts是Apache軟件基金會(huì)(ASF)贊助的一個(gè)開(kāi)源項(xiàng)目。它最初是jakarta項(xiàng)目中的一個(gè)子項(xiàng)目,并在2004年3月成為ASF的頂級(jí)項(xiàng)目。它通過(guò)采用JavaServlet/JSP技術(shù),實(shí)現(xiàn)了基于JavaEEWeb應(yīng)用的MVC設(shè)計(jì)模式的應(yīng)用框架,是MVC經(jīng)典設(shè)計(jì)模式中的一個(gè)經(jīng)典產(chǎn)品。

Struts是對(duì)JSPModel2設(shè)計(jì)標(biāo)準(zhǔn)的一種實(shí)現(xiàn),下面分別從模型(Model)、視圖(view)和控制器3個(gè)部分介紹Struts的體系結(jié)構(gòu)和工作原理。調(diào)用流程如下所示(圖1.1)。

京東數(shù)據(jù)泄漏,原來(lái)是Struts惹得禍!

(1)視圖(view)

在Struts中,視圖層包含兩個(gè)部分,JSP頁(yè)面和ActionForm。

ActionForm封裝了用戶提交的表單信息,其實(shí)ActonForm本質(zhì)上就是JavaBean,這些JavaBean中沒(méi)有業(yè)務(wù)邏輯,只提供了所有屬性的getter和setter方法,這些屬性和用戶表單中的輸入項(xiàng)是一一對(duì)應(yīng)的。在Struts中就是通過(guò)ActionForm把用戶表單信息提交給控制器。

JSP頁(yè)面是經(jīng)典MVC中主要的視圖組件,主要是信息顯示和控制器處理結(jié)果顯示的功能。

除了以上,struts還提供了一個(gè)強(qiáng)大的struts標(biāo)簽庫(kù),來(lái)幫助用戶解決顯示邏輯,并且利用ActonForm組件將信息傳遞到控制層。

(2)控制器(Controller)

在控制層,struts提供了一個(gè)控制器組件ActionServlet,它繼承自HttpServlet,并重載了HttpServlet的doGet(),doPost()方法,可以接受HTTP的響應(yīng),并進(jìn)行轉(zhuǎn)發(fā),同時(shí)還提供了使用XML進(jìn)行轉(zhuǎn)發(fā)Mapping(映射)的功能。

(3)模型(Model)

模型表示狀態(tài)和業(yè)務(wù)邏輯的處理,在一般的web應(yīng)用程序中,用JavaBean或者EJB來(lái)實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯。在Struts中,struts提供Action對(duì)象,來(lái)管理業(yè)務(wù)邏輯的調(diào)用,幫助用戶分離業(yè)務(wù)邏輯,也就是說(shuō)struts本身不實(shí)現(xiàn)業(yè)務(wù)邏輯,但可以調(diào)用已完成的業(yè)務(wù)邏輯。

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

京東數(shù)據(jù)泄漏,原來(lái)是Struts惹得禍!

ActionServlet是struts中核心的控制器,所有的用戶請(qǐng)求都必須通過(guò)ActionServlet的處理,而struts-config.xml是struts中核心的配置文件,在這個(gè)文件中配置了用戶請(qǐng)求URL和控制器Action的映射關(guān)系,ActionServlet通過(guò)這個(gè)配置文件把用戶的請(qǐng)求發(fā)送到對(duì)應(yīng)的控制器中。

在struts?web應(yīng)用程序中,當(dāng)web應(yīng)用程序啟動(dòng)的時(shí)候,就會(huì)初始化ActionServlet在初始化ActionServlet的時(shí)候會(huì)加載struts-config.xml配置文件,在加載成功后會(huì)把這些URL和控制器映射關(guān)系存放在ActionMapping對(duì)象或者其他對(duì)象中。當(dāng)ActionServlet接收到用戶請(qǐng)求的時(shí)候,就會(huì)按照下面的流程對(duì)用戶請(qǐng)求進(jìn)行處理。

(1)ActionServlet接收到用戶的請(qǐng)求后,會(huì)根據(jù)請(qǐng)求URL尋找匹配的ActionMapping對(duì)象,如果匹配失敗,說(shuō)明用戶請(qǐng)求的URL路徑信息有誤,所以返回請(qǐng)求路徑無(wú)效的信息,當(dāng)找到匹配的ActionMapping的時(shí)候,進(jìn)入到下一步。

(2)當(dāng)ActionServlet找到匹配的ActionMapping對(duì)象的時(shí)候,會(huì)根據(jù)ActionMapping中的映射信息判斷對(duì)應(yīng)的ActionForm對(duì)象是否存在,如果不存在對(duì)應(yīng)的ActionForm對(duì)象就創(chuàng)建一個(gè)新的ActionForm對(duì)應(yīng),并把用戶提交的表單信息保存到這個(gè)ActionForm對(duì)象中。

(3)在struts-config.xml中這個(gè)配置文件,可以配置表單是否需要驗(yàn)證,如果需要驗(yàn)證,就調(diào)用ActionForm中的validate()方法對(duì)用戶輸入的表單進(jìn)行驗(yàn)證。

(4)如果ActionForm的validate()方法返回了ActionErrors對(duì)象,則表明驗(yàn)證失敗,ActionServlet把這個(gè)頁(yè)面返回到用戶輸入的界面,提示用戶重新輸入。如果方法的返回值為null,就表明驗(yàn)證已經(jīng)通過(guò),可以進(jìn)入下一步處理。

(5)ActionServlet可以根據(jù)ActionMapping對(duì)象查找用戶請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)控制器Action,如果對(duì)應(yīng)的Action對(duì)象不存在,就創(chuàng)建這個(gè)對(duì)象,并調(diào)用這個(gè)Action的excute()方法。

(6)業(yè)務(wù)邏輯控制器Action的execute()方法就會(huì)返回一個(gè)ActionForward對(duì)象,ActionServlet把控制器處理的結(jié)果轉(zhuǎn)發(fā)到ActionForward對(duì)象指定的JSP頁(yè)面。

(7)ActionForward對(duì)象指定的JSP頁(yè)面根據(jù)返回的處理結(jié)果,用合適形式把服務(wù)器處理的結(jié)果展示給用戶,到這里為止,一個(gè)客戶請(qǐng)求的整個(gè)過(guò)程完畢。

Struts是一個(gè)開(kāi)源項(xiàng)目,廣泛應(yīng)用于大型互聯(lián)網(wǎng)企業(yè)、政府、金融機(jī)構(gòu)等網(wǎng)站建設(shè),并作為網(wǎng)站開(kāi)發(fā)的底層模板使用。可是再優(yōu)秀的大型的操作系統(tǒng)軟件或者是數(shù)據(jù)庫(kù)軟件,都難以避免地存在不同程度的bug或者安全漏洞。當(dāng)一些網(wǎng)絡(luò)高手或者是安全組織,發(fā)現(xiàn)安全漏洞之后,通常會(huì)發(fā)出漏洞安全警示,來(lái)提醒系統(tǒng)廠商或者軟件廠商進(jìn)行漏洞修補(bǔ)。但在2013年7月,Apache基金會(huì)旗下的Struts,在發(fā)現(xiàn)了一處安全漏洞之后并沒(méi)有像行業(yè)通行的發(fā)出漏洞警告,而是非常輕率和兒戲地放出了該漏洞的源代碼,這就相當(dāng)于把網(wǎng)絡(luò)安全的病灶公之于眾,即便水平低下的黑客也能知道網(wǎng)絡(luò)防御的軟肋,這使得很多技術(shù)很普通的的黑客,也能利用Struts 2安全漏洞相對(duì)輕松地獲取網(wǎng)絡(luò)上的各類數(shù)據(jù)。

其實(shí),京東數(shù)據(jù)泄露事件,目前來(lái)看真正受到影響的用戶還非常有限,京東的處置也很高效透明,但Struts 2這類的安全漏洞事件可能為整個(gè)中國(guó)互聯(lián)網(wǎng)產(chǎn)業(yè)發(fā)展埋下了很多地雷,這需要用雷霆手段來(lái)對(duì)抗。打擊數(shù)據(jù)偷竊、交易和消費(fèi)的網(wǎng)絡(luò)黑產(chǎn)業(yè)已迫在眉睫,這既需要全社會(huì)、全行業(yè)握緊鐵拳打擊,也需要每一個(gè)互聯(lián)網(wǎng)的使用者提高信息安全危機(jī)意識(shí)和防范水準(zhǔn),讓不法分子以易乘之機(jī)。