應(yīng)用Struts框架的一個(gè)安全隱患及解決方案
|
from: http://www.javaresearch.org/article/showarticle.jsp?column=23&thread=7621
|
重要提示:根據(jù)
lironghai的評(píng)論,經(jīng)驗(yàn)證,發(fā)現(xiàn)在WebLogic下由于安全限制不能使用本文所推薦的目錄安排。
為了保證系統(tǒng)的可移植性,不建議大家采用本文的方式。
問題
使用Struts框架時(shí),權(quán)限通常控制在Action級(jí)(比如將權(quán)限驗(yàn)證放在Action的基類中,這樣新的Action都繼承于這個(gè)Action基類,所有Action就可以專注于業(yè)務(wù)邏輯,而不需要重復(fù)地進(jìn)行權(quán)限控制了),這也符合MVC中的角色劃分。然而,這會(huì)產(chǎn)生一個(gè)安全隱患。因?yàn)闄?quán)限控制在 Action中,所以,頁面也就沒有安全屏障了。一般的新增數(shù)據(jù)、更新數(shù)據(jù)不會(huì)有什么問題,因?yàn)檫@些數(shù)據(jù)必須通過HTML的Form提交到Struts的中心控制器,最終由相應(yīng)的Action來處理,所以Action中就可以驗(yàn)證該用戶的權(quán)限了。然而,對(duì)于一些不需要Action進(jìn)行數(shù)據(jù)存取,或者有的頁面沒有嚴(yán)格按照MVC的角色劃分而在頁面中有獲取數(shù)據(jù)的代碼,那么這個(gè)頁面就危險(xiǎn)了。比如,顯示一張通知頁面,通常可以通過配置權(quán)限,使部分授權(quán)的用戶才可以看到該級(jí)別的通知。這個(gè)通知頁面是不需要從數(shù)據(jù)庫中獲取數(shù)據(jù)的。所以,可以不通過Action的調(diào)用來顯示,而是直接敲入顯示該通知的頁面的鏈接就可以看到了。甚至不需要登錄系統(tǒng),不用管是否有查看該通知的權(quán)限!
比如下圖中,請(qǐng)求1:
http://.../showannouncement.do
是通過正常的途徑訪問的,需要經(jīng)過權(quán)限驗(yàn)證。而請(qǐng)求2:
????http://.../announcementshow.jsp
則完全繞過了權(quán)限檢查,任何人,不需要登錄系統(tǒng)就可以訪問到該信息了。

?
解決方案
解決的辦法也不是沒有,非常簡(jiǎn)單。大家都知道JSP?Web容器會(huì)對(duì)應(yīng)用的WEB-INF目錄下的所有文件加以保護(hù)的,任何用戶都不能直接通過瀏覽器訪問 WEB-INF目錄(包括子目錄)下的任何資源,然而這些資源可以被JSP?Web容器訪問。所以,解決辦法已經(jīng)出來了。可以把你的JSP頁面放到WEB -INF目錄下,在struts-config.xml的action的配置中注意要把轉(zhuǎn)向的頁面指向類似:/WEB- INF/pages/announcementshow.jsp。這樣就保證了所有數(shù)據(jù)的安全了。
使用本文的方法,甚至可以對(duì)靜態(tài)的頁面,比如html的頁面進(jìn)行保護(hù),設(shè)置權(quán)限以限制訪問。
posted on 2006-03-23 23:06
rd2pm 閱讀(382)
評(píng)論(2) 編輯 收藏