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