Java Struts 特性和新特性总结
生活随笔
收集整理的這篇文章主要介紹了
Java Struts 特性和新特性总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
struts2新特性預(yù)覽
Struts2與Struts1的對比?
Action 類:?
? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。?
? Struts 2 Action類可以實(shí)現(xiàn)一個Action接口,也可實(shí)現(xiàn)其他接口,使可選和定制的服務(wù)成為可能。Struts2提供一個ActionSupport基類去實(shí)現(xiàn) 常用的接口。Action接口不是必須的,任何有execute標(biāo)識的POJO對象都可以用作Struts2的Action對象。?
線程模式:?
? Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實(shí)例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時特別小心。Action資源必須是線程安全的或同步的。?
? Struts2 Action對象為每一個請求產(chǎn)生一個實(shí)例,因此沒有線程安全問題。(實(shí)際上,servlet容器給每個請求產(chǎn)生許多可丟棄的對象,并且不會導(dǎo)致性能和垃圾回收問題)?
Servlet 依賴:?
? Struts1 Action 依賴于Servlet API ,因為當(dāng)一個Action被調(diào)用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。?
? Struts 2 Action不依賴于容器,允許Action脫離容器單獨(dú)被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。?
可測性:?
? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對象(來進(jìn)行測試)。?
? Struts 2 Action可以通過初始化、設(shè)置屬性、調(diào)用方法來測試,“依賴注入”支持也使測試更容易。?
捕獲輸入:?
? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發(fā)者經(jīng)常創(chuàng)建多余的類捕獲輸入。動態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存在的JavaBean(仍然會導(dǎo)致有冗余的javabean)。?
? Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業(yè)務(wù)對象,能夠用作輸入/輸出對象。這種ModelDriven 特性簡化了taglib對POJO輸入對象的引用。?
表達(dá)式語言:?
? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。?
? Struts2可以使用JSTL,但是也支持一個更強(qiáng)大和靈活的表達(dá)式語言--"Object Graph Notation Language" (OGNL). ?
綁定值到頁面(view):?
? Struts 1使用標(biāo)準(zhǔn)JSP機(jī)制把對象綁定到頁面中來訪問。?
? Struts 2 使用 "ValueStack"技術(shù),使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。?
?
類型轉(zhuǎn)換:?
? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換。每個類一個轉(zhuǎn)換器,對每一個實(shí)例來說是不可配置的。?
? Struts2 使用OGNL進(jìn)行類型轉(zhuǎn)換。提供基本和常用對象的轉(zhuǎn)換器。?
校驗: ?
? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴(kuò)展來校驗。同一個類可以有不同的校驗內(nèi)容,但不能校驗子對象。?
? Struts2支持通過validate方法和XWork校驗框架來進(jìn)行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內(nèi)容校驗,來支持chain校驗子屬性 ?
Action執(zhí)行的控制:?
? Struts1支持每一個模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。?
? Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。
Struts2 優(yōu)點(diǎn)收集整理
Struts2比Struts1已經(jīng)有了很大的進(jìn)步,優(yōu)點(diǎn)很多,其中主要是:?
增強(qiáng)頁面數(shù)據(jù)處理功能(OGNL、valueStack)。
簡化捕獲表單數(shù)據(jù)對象過程 (類型轉(zhuǎn)換)
提供靈活豐富功能和插件, 易于使用和擴(kuò)展 (攔截器、插件支持、Action生命周期、校檢);
提高線程安全性(單例—原型);
提高可測性(不依賴servlet、struts,提供依賴注入);
表達(dá)式語言:
? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。?
? Struts2可以使用JSTL,但是也支持一個更強(qiáng)大和靈活的表達(dá)式語言--"Object Graph Notation Language" (OGNL).?
【((EntCustomer)jack.getCustomer()).getTrustId()----jack.customer.trustId】?
** 不需關(guān)注對象類型,不需進(jìn)行類型轉(zhuǎn)換?
** 表達(dá)方式更簡短和直觀?
綁定值到頁面(view):
? Struts 1使用標(biāo)準(zhǔn)JSP機(jī)制把對象綁定到頁面中來訪問。?
? Struts 2 使用 "ValueStack"技術(shù),使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。?
插件支持:
? Struts2是基于插件開發(fā)的框架,能簡單快速的使用大量成熟實(shí)用的插件和視圖?
依賴注入:
? Struts2提供依賴注入,并能很好的和spring ioc整合。?
Struts2 AOP-攔截器:
? Struts2提供強(qiáng)大的、可插拔的攔截器以及攔截器棧,?
個人覺得Struts1是基于servlet開發(fā),Struts2是基于Filter開發(fā),相對于現(xiàn)在的企業(yè)來說Struts1的技術(shù)成熟,便于維護(hù),而且現(xiàn)在的許多程序員使用SSH框架時,還是多選用struts1來開發(fā)~~ 當(dāng)然Struts2安全性比Struts1要高~~?
Action生命周期控制:
? Struts1支持每一個模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。?
? Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。?
線程安全:
? Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實(shí)例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發(fā)時特別小心。Action資源必須是線程安全的或同步的。?
? Struts2 Actions是原型模式,對象為每一個請求產(chǎn)生一個實(shí)例,因此沒有線程安全問題。(實(shí)際上,servlet容器給每個請求產(chǎn)生許多可丟棄的對象,并且不會導(dǎo)致性能和垃圾回收問題)?
Struts框架依賴:
? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。?
? Struts 2 Action類可以實(shí)現(xiàn)一個Action接口,也可實(shí)現(xiàn)其他接口,使可選和定制的服務(wù)成為可能。Struts2提供一個ActionSupport基類去實(shí)現(xiàn)常用的接口。Action接口不是必須的,任何有execute標(biāo)識的POJO對象都可以用作Struts2的Action對象。?
Servlet 依賴:
? Struts1 Action 依賴于Servlet API ,因為當(dāng)一個Action被調(diào)用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。?
? Struts 2 Action不依賴于容器,允許Action脫離容器單獨(dú)被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。?
捕獲輸入[表單數(shù)據(jù)封裝對象:]:
? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發(fā)者經(jīng)常創(chuàng)建多余的類捕獲輸入。動態(tài)Bean(DynaBeans)可以作為創(chuàng)建傳統(tǒng)ActionForm的選擇,但是,開發(fā)者可能是在重新描述(創(chuàng)建)已經(jīng)存在的JavaBean(仍然會導(dǎo)致有冗余的javabean)。?
? Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業(yè)務(wù)對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。?
可測性:
? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴(kuò)展--Struts TestCase--提供了一套Struts1的模擬對象(來進(jìn)行測試)。?
? Struts 2 Action可以通過初始化、設(shè)置屬性、調(diào)用方法來測試,“依賴注入”支持也使測試更容易。?
類型轉(zhuǎn)換:
? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進(jìn)行類型轉(zhuǎn)換。每個類一個轉(zhuǎn)換器,對每一個實(shí)例來說是不可配置的。?
? Struts2 使用OGNL進(jìn)行類型轉(zhuǎn)換。提供基本和常用對象的轉(zhuǎn)換器。?
校驗:
? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴(kuò)展來校驗。同一個類可以有不同的校驗內(nèi)容,但不能校驗子對象。?
? Struts2支持通過validate方法和XWork校驗框架來進(jìn)行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內(nèi)容校驗,來支持chain校驗子屬性
Struts2的新特性new
Struts 1.0非常成熟,因此得到眾多開發(fā)社區(qū)的有力支持,而且說明文檔內(nèi)容完備。不過在過去的幾年里,許多開源社區(qū)的Web框架紛紛登臺亮相,所以它需要跟上 Web應(yīng)用需求不斷變化的形勢,這就有必要構(gòu)建下一代Struts框架。力求滿足這個要求的初始提案是Struts Ti,這種簡化的MVC Model 2框架可用于讓需要更少配置、更好結(jié)構(gòu)和控制器特性的人開發(fā)Web應(yīng)用。
WebWork項目由Open Symphony社區(qū)啟動,面向Struts開發(fā)社區(qū)。它旨在滿足那些希望尋求類似Struts的一種框架,但有更好特性的人的需要。WebWork框架 于2002年發(fā)布。獨(dú)立運(yùn)作了幾年后, WebWork和Struts兩個社區(qū)在2005年12月聯(lián)合起來,開發(fā)了新版本的Struts,即Struts 2。Struts 2實(shí)際上就是Struts 1與WebWork的結(jié)合體。Struts的這個新版本更易使用,更接近Struts框架的最初版本。
Struts 2.0的新特性
改進(jìn)的設(shè)計: 與Struts 1相比,Struts 2的所有類都基于接口,核心接口獨(dú)立于HTTP。這些API并不依賴服務(wù)器小程序API。
簡化的Action: Struts 2 Action類獨(dú)立于框架,是簡化的普通Java對象(POJO)。擁有execute()方法的任何Java類都可以用做Action類。
POJO表單: Struts 2不支持ActionForms特性。ActionForms中定義的屬性可以直接放在Action類上。不需要使用所有的String屬性。
智能默認(rèn)值: Struts 2配置文件中的大多數(shù)配置元素都會有默認(rèn)值,所以不需要設(shè)定值,除非需要不同的值。這有助于減少在XML文件中需要進(jìn)行的配置。Struts 2支持注釋,這帶來了更大的方便。
改進(jìn)的結(jié)果: 在Struts 2中,
>forward<標(biāo)簽被<result>標(biāo)簽取代。不像 ActionForwards,Struts 2結(jié)果可以幫助準(zhǔn)備響應(yīng),并提供構(gòu)建多種輸出類型的靈活性。
改進(jìn)的標(biāo)簽: Struts 2標(biāo)簽不單單發(fā)送輸出數(shù)據(jù),還能提供樣式表驅(qū)動標(biāo)記,這樣就可以用較少的代碼構(gòu)建一致性頁面。Struts 2標(biāo)簽現(xiàn)在可與FreeMarker、Velocity及類似模板引擎配合使用。
引入攔截器: Struts 2為攔截器(interceptor)提供了全面支持。攔截器可在Action類執(zhí)行前后加以執(zhí)行。攔截器經(jīng)配置后,可以把工作流程或者驗證等常見功能作 用到請求上。所有請求通過一組攔截器傳送,之后再發(fā)送到Action類。Action類被執(zhí)行后,請求按照相反順序再次通過攔截器傳送。
支持Ajax: 為了創(chuàng)建使用Ajax的動態(tài)Web應(yīng)用,Struts 2提供了Ajax主題,從而大大改進(jìn)了交互應(yīng)用。面向Ajax的Struts 2標(biāo)簽基于Dojo窗口組件。還有用于其他框架的插件。
快速啟動: 部署配置文件可以重新裝入; 因而,可以動態(tài)地進(jìn)行許多變化,用不著重新啟動Web容器。
狀態(tài)復(fù)選框: Struts 2框架可自動跟蹤復(fù)選框,如果缺少了某復(fù)選框,就會采用默認(rèn)值false。因而,不像在Struts 1中,復(fù)選框不需要對false值進(jìn)行特殊處理。
易于測試: Struts 2 Actions獨(dú)立于HTTP,因而與框架中立。無須使用模擬對象(mock object),就很容易測試。
使用注釋: 使用Struts 2開發(fā)的應(yīng)用可以使用Java 5注釋,作為XML和Java屬性配置之外的一個替代辦法。注釋盡量減少了對XML的需要。Action、攔截器、驗證及類型轉(zhuǎn)換方面都有注釋。
易于插入: 只要把插件JAR文件放到\WEB-INF\lib目錄中,即可輕松安裝Struts 2插件,不需要手動配置。
便于與Spring集成: Struts 2 Action能夠感知Spring(Spring-aware)。只要為某個應(yīng)用添加Spring beans,就可以添加對Spring的支持。
易于定制的控制器: Struts 1允許請求處理程序可按照模塊來定制,在Struts 2中,需要的話,可以按照動作來定制請求處理。
Struts框架開發(fā)安全特性
前言?
Struts是目前J2ee Web開發(fā)中最常見使用的MVC框架。由于使用框架編寫的應(yīng)用程序與原生jsp編寫的Web程序區(qū)別較大,因此有必要專門撰寫一篇文檔描述Struts框架的安全特性,及其檢查方法。?
Struts介紹?
Struts是一套MVC框架,目前分為兩個大版本號。1.x系列,已經(jīng)放棄開發(fā),是一個較為簡單的框架,安全特性也較少。2.x系列則是直接與webwork這個框架合并之后基于webwork重新開發(fā)的一套全新框架。目前主流使用框架基本就是2.x系列。?
Struts1?
s1.png?
圖 2.1 struts1架構(gòu)圖?
如上圖所示,struts 1.x系列的模型主要分為幾個部分:最主要的Dispatcher、Controller是使用J2ee的servlet實(shí)現(xiàn)的,用戶請求過來,通過用戶自定義的一系列過濾器(filter)之后,servlet分析匹配其url結(jié)構(gòu),再轉(zhuǎn)給各action類,最后進(jìn)行form的填充控制、View層的調(diào)用展現(xiàn)。其主要代碼是在action中實(shí)現(xiàn)的,可以根據(jù)struts-config.xml中的配置,根據(jù)url->action->view的對應(yīng)關(guān)系一一查看其代碼。Struts1中的統(tǒng)一控制一般做在filter中,或者由form的校驗函數(shù)做數(shù)據(jù)有效性控制。?
Struts2?
s2.png?
圖 2.2 struts2架構(gòu)圖?
而struts2.x的架構(gòu)就復(fù)雜很多,也細(xì)致的多。用戶的請求過來,先經(jīng)過一系列過濾器(Filter實(shí)現(xiàn)),最后一個過濾器通過actionProxy才是真正對不同的action派發(fā)調(diào)用,其中的派發(fā)規(guī)則由struts.xml定義。這幾部分相加,才類似于之前Struts1中的ActionServlet的作用。在調(diào)用action之前,還有類似Hook的機(jī)制,在action執(zhí)行前后、view執(zhí)行前后分別有可以統(tǒng)一執(zhí)行的用戶自定義代碼。在struts2的說法中,叫做攔截器(Interceptor)。通常struts2中的統(tǒng)一控制就在過濾器、攔截器、校驗器這幾個方面做控制,其中后兩者最普遍。?
如何區(qū)分Struts框架應(yīng)用程序?
URL中以.do結(jié)尾的,struts1框架;以.action結(jié)尾的,struts2框架。?
Struts1由于是通過servlet進(jìn)行的action控制,因此主要配置文件在WEB-INF/web.xml及struts-config.xml這兩個文件中;Struts2的配置文件則主要就是WEB-INF/struts.xml。?
目錄組織結(jié)構(gòu)中如果有Filter、Interceptor的定義實(shí)現(xiàn),通常是Struts2的代碼。?
如果有專門的xxxForm.java代碼,一般是Struts1的項目;Struts2通常只有一些簡單的Java Bean定義作為模型。?
Struts框架安全特性?
Struts1的白盒安全測試方法?
之前我們說過,Struts1中的統(tǒng)一控制一般做在filter中,或者由form的校驗函數(shù)做數(shù)據(jù)有效性控制。因此,無論是哪一方面的統(tǒng)一控制,例如參數(shù)的統(tǒng)一過濾、驗證是否登錄、文件上傳驗證之類,通常是在Filter中進(jìn)行的;而參數(shù)的有效性,例如email只允許[0-9a-zA-Z_@]。?
建議在讀代碼時,先通讀web.xml和struts-config.xml兩個文件,從web.xml中了解filter的設(shè)置,將所有filter通讀一遍,了解總體上做了什么限制,再從struts-config.xml了解action與actionForm、View的對應(yīng)關(guān)系,然后根據(jù)這些關(guān)系,檢查form中的參數(shù)有效性驗證方法(validate函數(shù))是否做了足夠的檢查,以及view中是否有基本的html過濾。具體測試case這里不多言,只要找對地方,java的測試case和其他語言也基本都差不多。?
Struts1安全特性?
參數(shù)獲取?
通常使用J2ee中最常見的Request.getParamter()方法獲取用戶輸入。此方法結(jié)合了GET/POST中提交的變量,如果兩者有重名,則GET獲取的優(yōu)先,獲取的內(nèi)容非常原始,沒有任何改變。不同于PHP中的$_REQUEST變量,Request.getParamter方法并沒有包含cookie中獲取的變量。?
actionForm中獲取的變量也是框架通過上述方法獲取的,因此雖然看起來是直接使用沒有通過函數(shù)獲取,實(shí)際上也是一樣。?
文件操作?
文件下載在struts中并沒有做任何限制。在文件上傳中,一般是使用Apache-Common-FileUpload的組件。其中也未替代用戶做任何限制和檢查,需要手工實(shí)現(xiàn)擴(kuò)展名判斷、驗證等代碼。因此如果action中的邏輯代碼沒有做任何檢查,基本可以判斷存在問題。?
前端防范?
一般Struts1使用jsp作為默認(rèn)的前端引擎,常見的過濾方式與jsp相同,不做贅述。?
CSRF防范?
Struts1提供了一個生成并驗證Token的api(isTokenVaild),在檢查是否防范了CSRF的時候,可以查看應(yīng)用程序是否使用了這個API(也可以查看提交的請求包中是否包含org.apache.struts.taglib.html.TOKEN這個變量)。如果未使用,就可以檢查是否在Filter之類的地方做了統(tǒng)一的自己實(shí)現(xiàn)的CSRF token驗證防范。?
Struts1提供的Token值是存儲在SESSION中的,因此這里就存在一個bug。由于Token在session中保存的變量名不變,因此如果一個用戶打開了多個窗口,只有最后一個窗口設(shè)置的token值有效。這里需要多加注意。?
其他?
此外,Struts1有個特性:一個Action類在程序周期中只有一個實(shí)例,常駐內(nèi)存。因此,在這個類中的屬性和變量是共享的,不同用戶訪問的不同請求都是如此。因此如果程序中的邏輯依靠Action內(nèi)部變量傳送敏感信息,則其他用戶也可能改寫、讀取。?
Struts2的白盒安全測試方法?
Struts2的安全測試主要方法論與S1一致,也多是通過查看struts.xml和web.xml中的配置,了解url->action->view的關(guān)系,以及不同url中涉及到的過濾器、攔截器、驗證器(一般在validation.xml和className-validation.xml中配置)的關(guān)系。了解了這些,在頭腦中有一個清晰的數(shù)據(jù)流脈絡(luò),然后再檢查這些控制措施是否做到位,是否有疏漏即可。一般來說,S2的控制大都在攔截器和驗證器中進(jìn)行,常見的有是否登錄、文件上傳格式檢查、參數(shù)有效性檢查等。S2默認(rèn)提供了很多攔截器,做了以上功能,這些在下面的安全特性中會提及。?
Struts2的安全特性?
參數(shù)獲取?
與S1不同,S2中的參數(shù)獲取雖然也可以通過Request.getParamter()方法,但是很少使用。因為action類中定義過getter/setter方法的變量,如果用戶在請求中提交了同名的變量,框架會自動將其值注入到action實(shí)例中的對應(yīng)變量中去,并且會做響應(yīng)的類型轉(zhuǎn)換。這一切是通過defaultStack中默認(rèn)的Param攔截器實(shí)現(xiàn)的,利用攔截器,在action執(zhí)行前,將用戶傳入的數(shù)值使用Request.getParamter()獲取后并經(jīng)過解析自動注入。?
這一點(diǎn)請一定注意。因為如果action中的內(nèi)部成員變量之前有一個默認(rèn)值,一旦用戶提交了同名變量,就可以覆蓋此值。這樣就會直接導(dǎo)致后續(xù)依賴此默認(rèn)值的邏輯發(fā)生重大變化。?
文件操作?
下載文件沒有限制,需要自行編寫代碼控制。?
上傳文件,S2默認(rèn)有一個FileUploadInterceptor的攔截器,提供了三種限制方法,都在struts.xml中配置:
allowedTypes(允許文件的mime-type值,可偽造)?
maxmumSize(允許文件最大的字節(jié)數(shù))?
allowedExtensions(允許文件的擴(kuò)展名)
由于早期S2框架文檔的誤導(dǎo),提供的例子程序中只限制了allowedTypes,因此導(dǎo)致多數(shù)s2應(yīng)用程序存在修改http包修改mime-type導(dǎo)致任意上傳漏洞。因此在做安全測試的時候,一定要檢查是否設(shè)置了allowedExtensions作為白名單,而不單單是allowedTypes。另外即使做了擴(kuò)展名限制,請注意這個可能還存在多擴(kuò)展名文件的問題。?
如果上傳沒有使用默認(rèn)的FileUploadInterceptor,請檢查程序邏輯中是否對文件上傳做了嚴(yán)格的限定。?
CSRF防范?
S2中也提供了防范重復(fù)提交的Token機(jī)制。與S1不同的是此次他是使用TokenInterceptor這個攔截器的方式,在action執(zhí)行前統(tǒng)一進(jìn)行驗證。Token值也是保存在session中,因此同樣存在S1框架中Token的bug。?
此外,這個Token機(jī)制還有個可以被繞過的0day漏洞:由于TokenInterceptor在驗證用戶提交上來的請求時,先從用戶請求中的struts.token.name值作為session中的key,然后比對用戶請求中提交的token值是否與session中key對應(yīng)的值相匹配,如匹配則通過。但是,如果攻擊者預(yù)先知曉session中已保存的一個值,例如username=admin,則攻擊者可以直接將csrf包中的struts.token.name設(shè)置為username,然后token值設(shè)置為admin,即可輕易繞過csrf token防范。?
因此,如果經(jīng)檢查的應(yīng)用中使用了默認(rèn)的token攔截器,請?zhí)嵝验_發(fā)人員彌補(bǔ)以上不足。如自行實(shí)現(xiàn)防重復(fù)提交的代碼,請仔細(xì)檢查其邏輯的嚴(yán)密性。?
動態(tài)方法調(diào)用?
Struts2中存在一個特性,叫做動態(tài)方法調(diào)用。當(dāng)你請求actionName!methodName.action這樣的URL時,框架不會調(diào)用action中的默認(rèn)入口execute(),而是會尋找action中名叫methodName的方法,并直接調(diào)用。通過這種方式,可能暴露action類中未經(jīng)過驗證的內(nèi)部接口,也可能繞過一些權(quán)限驗證。?
因此,在測試過程中,如果程序本身沒有使用到這個特性,請建議RD在struts.xml中設(shè)置一個constant將struts.enable.DynamicMethodInvocation屬性設(shè)置為false,禁止此特性。?
前端模板?
S2自帶的taglib中的變量輸入都經(jīng)過了自動html轉(zhuǎn)義。一般無問題。但是請注意參數(shù)名前帶感嘆號,則表示沒有轉(zhuǎn)義。安全檢測時請務(wù)必注意。?
如果使用其他模板引擎,請根據(jù)其他引擎的過濾規(guī)則進(jìn)行檢查。?
其他?
與s1不同,s2中每一個請求對應(yīng)一個不同的action實(shí)例,沒有action實(shí)例中變量共享的問題。?
S2的action中execute方法,根據(jù)方法返回的值來決定最后調(diào)用哪一個view模板。因此,結(jié)合動態(tài)方法調(diào)用和自動變量注入的特性,如請求actionName!getUsername.action?username=pass。而action中對應(yīng)“pass”這個返回結(jié)果的view又是個包含敏感信息的模板,就可能產(chǎn)生問題。因此在安全測試的過程中需要特別注意。
總結(jié)
以上是生活随笔為你收集整理的Java Struts 特性和新特性总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小操作系统的代码解释、NASM的初步使
- 下一篇: Linux内核图集