陳姍 萬曉燕
摘 要:本文本文以網(wǎng)上基金交易平臺(tái)這個(gè)項(xiàng)目為例,探討了項(xiàng)目開發(fā)中權(quán)限控制、加密方法等安全性問題。
關(guān)鍵詞:SSH;權(quán)限控制;MD5加密
隨著Java技術(shù)的逐漸成熟與完善,作為建立企業(yè)級(jí)應(yīng)用的標(biāo)準(zhǔn)平臺(tái),J2EE平臺(tái)得到了長足的發(fā)展,Struts+Spring+Hiber
nate三者結(jié)合起來成為當(dāng)今企業(yè)開發(fā)中普遍使用的一種快速高效的開發(fā)模式。但是,作者在利用這種模式進(jìn)行實(shí)際項(xiàng)目開發(fā)時(shí)遇到了很多安全性的問題。本文以網(wǎng)上基金交易平臺(tái)項(xiàng)目為例,探討了基于SSH的項(xiàng)目在開發(fā)過程中會(huì)遇到的重要安全性問題以及相應(yīng)的解決方案。
一、SSH開發(fā)模式
SSH模式是基于J2EE架構(gòu)的一種Framework,用Struts實(shí)現(xiàn)表示層,用Spring實(shí)現(xiàn)業(yè)務(wù)層,用Hibernate實(shí)現(xiàn)持久層,然后把這三者整合起來應(yīng)用到項(xiàng)目開發(fā)中。
Struts是 Apache Jakarta項(xiàng)目推出的一個(gè)開源的Java Web框架,它很好的實(shí)現(xiàn)了MVC設(shè)計(jì)模式。Spring是一款近幾年非常流行的、開源的開發(fā)框架,Spring的核心是一個(gè)實(shí)現(xiàn)了IoC(Inversion of Control)模式的輕量級(jí)容器。Hibernate是目前最流行的ORM框架,是連接Java對象模型(java object modle)和關(guān)系數(shù)據(jù)模型的橋梁,它對JDBC進(jìn)行了輕量級(jí)的封裝,不僅提供ORM映射服務(wù),還提供數(shù)據(jù)查詢和數(shù)據(jù)緩沖功能。
二、SSH開發(fā)中存在的安全性問題及解決方案
本文下面以項(xiàng)目中登陸模塊為例,探討一下針對這些安全性問題的解決方案。
(一)權(quán)限控制實(shí)現(xiàn)。在本系統(tǒng)中,需要權(quán)限管理的問題有很多。下面舉其中一個(gè)作為例子,說明一下我們關(guān)于權(quán)限控制的實(shí)現(xiàn)思路。
基金交易操作人員分兩個(gè)等級(jí),高級(jí)操作人員可以注冊新的操作員、對基金進(jìn)行增刪改的操作,而普通操作人員僅能進(jìn)行查詢基金信息、買賣基金等操作。我們定義不同的變量區(qū)分不同操作任務(wù),如delFund代表刪除基金,值“1”為有權(quán)限,值“0”為無權(quán)限。
為了存取的方便和信息的安全,我們將所有權(quán)限信息封裝在一個(gè)類UserInfo中,在用戶登錄系統(tǒng)后根據(jù)用戶的角色將其權(quán)限寫入session,當(dāng)用戶要進(jìn)行某個(gè)操作時(shí),我們首先從
session中取出其權(quán)限值進(jìn)行判斷,如果權(quán)限不夠則返回到相應(yīng)的報(bào)錯(cuò)頁面,并在log中記錄該越權(quán)操作,在用戶退出系統(tǒng)后銷毀session中相應(yīng)的權(quán)限數(shù)據(jù)。
由于本系統(tǒng)采用SSH整合模式,我們可以利用AOP編程實(shí)現(xiàn)細(xì)粒度的權(quán)限管理。定義一個(gè)權(quán)限管理模塊,在Dele
gatingActionProxy中調(diào)用該權(quán)限管理模塊針對具體的對象和操作進(jìn)行權(quán)限判斷,如果具有該權(quán)限,則將請求發(fā)生到相應(yīng)的
Action操作。經(jīng)過這樣的設(shè)計(jì)處理后,很好的實(shí)現(xiàn)了權(quán)限控制,而且系統(tǒng)代碼耦合性低、易于擴(kuò)展。
(二)防止SQL注入式攻擊。SQL注入就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。常見的一種攻擊方式是,有查詢語句:
statement := "SELECT * FROM users WHERE name = '"
+ userName + "';
該語句的目的本來在于測試用戶名是否合法,但是,如果用戶名被一個(gè)惡意的用戶用一種特定的方式偽造,這個(gè)語句所執(zhí)行的操作就不是代碼的作者所期望的那樣了。例如,將用戶名變量(即username)設(shè)置為:a' or 't'='t,此時(shí)原始語句發(fā)生了變化:SELECT * FROM users WHERE name = 'a' OR 't'='t';這樣一來,在認(rèn)證過程中,用戶名就被認(rèn)為永久性合法了,這對于web系統(tǒng)來說顯然是非常危險(xiǎn)的。
SQL注入是從正常的WWW端口訪問,而且表面看起來跟一般的Web頁面訪問沒什么區(qū)別,所以目前市面的防火墻都不會(huì)對SQL注入發(fā)出警報(bào),如果管理員沒查看IIS日志的習(xí)慣,可能被入侵很長時(shí)間都不會(huì)發(fā)覺。
基金交易系統(tǒng)式非常容易受到這種攻擊的,侵入者通常采用這種方式盜取客戶的帳戶和密碼,使客戶蒙受巨大的經(jīng)濟(jì)損失,所以如何防止SQL注入式攻擊也是作者在系統(tǒng)設(shè)計(jì)中著重考慮的一個(gè)問題。經(jīng)過一系列實(shí)驗(yàn)和探討,作者最終采用了如下方法。
以往作者直接使用JDBC連接數(shù)據(jù)庫時(shí),通常采用
PrepareStatement來解決注入式攻擊的問題,在SSH架構(gòu)中,持久層使用的是Hibernate連接,所以使用采用占位符防止SQL注入式攻擊更為簡單。
結(jié)束語:對于web應(yīng)用系統(tǒng)的搭建來說,系統(tǒng)的安全性是一個(gè)至關(guān)重要的問題,經(jīng)過作者在權(quán)限控制、加密、驗(yàn)證碼、sql注入式攻擊幾方面的改進(jìn)之后,整個(gè)系統(tǒng)具有了更好的安全性和健壯性,同時(shí)還保證了代碼的低耦合和易于擴(kuò)展。本文討論的SSH模式的幾種安全方案具有很好的實(shí)踐意義,是對SSH模式一個(gè)很好的改進(jìn)。
參考文獻(xiàn):
[1] Struts official network..The apache software foundation [EB/OL]. http://struts.apache.org/.
[2] Hibernate official network.Relational Persistence for Java and.NET[EB/OL]. http://www.hibernate.org.