開源Java框架帶來的應(yīng)用安全風(fēng)險(xiǎn)
Java安全風(fēng)險(xiǎn)是重所周知的,但是您是否了解一些開源Java框架的安全問題呢?例如,Struts、Hibernate、JavaEE。哪一個(gè)框架最安全,又有哪些措施可以提高它們的安全性?
只要開發(fā)者認(rèn)真學(xué)習(xí),許多開源Java框架都可以幫助完成應(yīng)用開發(fā)。框架可以提高開發(fā)者生產(chǎn)力,但是大多數(shù)人都必須經(jīng)過足夠的學(xué)習(xí)過程,才能發(fā)揮框架的真正作用。CAST最近發(fā)布了一份報(bào)告,其中顯示最流行的開源Java框架是Struts、JavaEE、Hibernate和Spring。然而,沒有一種框架提供了足夠的安全性,或者保證完美無瑕的代碼。
為了尋找最安全的框架,CAST調(diào)查了496個(gè)應(yīng)用程序的1.52億行代碼,結(jié)果發(fā)現(xiàn)最大的問題是,大部分應(yīng)用實(shí)際上都有錯(cuò)誤配置。我并不確定這些統(tǒng)計(jì)結(jié)果是否可以推斷出其他一些調(diào)查結(jié)果,但是這個(gè)結(jié)果突出了培訓(xùn)的重要性,只有通過培訓(xùn)才能讓開發(fā)者知道如何正確使用所選擇的框架。
任何應(yīng)用開發(fā)的計(jì)劃階段都應(yīng)該確定一組特定的安全需求,如身份驗(yàn)證、授權(quán)和加密方式,使開發(fā)團(tuán)隊(duì)能夠選擇最適合這些需求的框架。而且,有可能需要使用多個(gè)框架才能支持所有需求,但是這樣可能增加應(yīng)用程序的整合難度。
我個(gè)人認(rèn)為,使用好的框架確實(shí)可以提高編碼質(zhì)量和減少Bug數(shù)量。CAST報(bào)告顯示,不使用任何框架的應(yīng)用程序會(huì)出現(xiàn)各種質(zhì)量問題。影響框架選擇的其他因素包括文檔質(zhì)量,特別是安全API的文檔,因?yàn)樗鼈兛赡芊浅?fù)雜,顯然有嚴(yán)格的使用要求。另一個(gè)問題是框架用戶社區(qū)的響應(yīng)速度,因?yàn)檫@是獲取幫助和支持的重要來源。
要提高框架安全性,有時(shí)需要修改其他人的代碼,而這是非常難的。他們發(fā)布的任何更新或補(bǔ)丁都可能覆蓋您所作的修改,或者影響它們的行為。如果您發(fā)現(xiàn)它很重要,那么必須檢查所有處理用戶輸入及應(yīng)用入口的代碼。輸入是否有效?是否處理了所有特殊字符或特殊值?如果沒有,那么您必須自己增加驗(yàn)證和過濾功能,保證傳遞到應(yīng)用程序的數(shù)據(jù)一定是安全的。
在使用任何第三方代碼或應(yīng)用程序時(shí),您必須緊跟供應(yīng)商或Bug列表,及時(shí)了解所有安全警報(bào)。例如,Aspect Security的研究人員發(fā)現(xiàn),Spring框架的“表達(dá)式語言”功能有一個(gè)缺陷,它允許執(zhí)行遠(yuǎn)程代碼,可能完全破壞相應(yīng)用程序。這個(gè)問題很難解決,目前的建議是關(guān)閉表達(dá)式語言特性。如果開發(fā)者不了解這些漏洞,那么他們的應(yīng)用程序就有可能無法避免這些攻擊。開發(fā)團(tuán)隊(duì)?wèi)?yīng)該有一位成員負(fù)責(zé)跟蹤編程語言及開發(fā)工具的安全更新,而且他要知道如何處理警報(bào)和重要補(bǔ)丁更新。