雷虹蘭 全祥
摘要:MVC設(shè)計模式被廣泛應(yīng)用于企業(yè)及項目開發(fā),且許多項目都離不開登錄模塊.登錄模塊的安全性將直接影響用戶信息安全以及項目的可靠程度.針對網(wǎng)站登錄模塊的安全性,分別在MVC三層架構(gòu)上提出了對用戶數(shù)據(jù)進行安全性處理的方法,保障用戶登錄信息安全.經(jīng)實際應(yīng)用驗證,能有效提高網(wǎng)站登錄模塊的安全性,提高網(wǎng)站質(zhì)量.
關(guān)鍵詞:MVC;網(wǎng)站開發(fā);登錄;安全性
中圖分類號:TP311? 文獻標識碼:A? 文章編號:1673-260X(2019)02-0049-03
MVC設(shè)計模式是軟件工程學中一個非常重要的設(shè)計模式,其思想的核心就是分層,它能夠有效分離數(shù)據(jù)和表現(xiàn),并提供了分離功能層的機制[1].MVC將系統(tǒng)的各個組件進行分類,使系統(tǒng)開發(fā)變得非常靈活,同時又提高了系統(tǒng)設(shè)計的可重用性.網(wǎng)站登錄模塊是當前大多系統(tǒng)都必須要設(shè)計和實現(xiàn)的部分,該模塊也常采用此設(shè)計模式來提高系統(tǒng)的靈活性和可重用性.
網(wǎng)絡(luò)安全問題[2]一直是計算機行業(yè)的焦點問題,安全登錄也就成了開發(fā)者必須考慮的因素.若系統(tǒng)存在登錄模塊將不得不面臨用戶登錄的隱私安全問題,以不斷提高項目開發(fā)的安全性.因此,針對MVC設(shè)計模式的登錄模塊安全性研究具有一定的現(xiàn)實價值.
1 MVC簡介
MVC是模型(model)、視圖(view)和控制器(controller)的簡稱,是Trygve Reenskaug在1979年提出的一種GUI軟件設(shè)計模式[3].MVC是一種軟件設(shè)計典范,它很好地將業(yè)務(wù)處理與顯示分離,將應(yīng)用分為模型、視圖以及控制層.視圖層主要用于數(shù)據(jù)顯示和用戶交互;控制層主要用于接收用戶請求,將請求分發(fā)給模型層進行業(yè)務(wù)處理,并將處理結(jié)果返還到視圖層;模型層主要負責業(yè)務(wù)邏輯處理.該模式用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,視圖層和控制層的分離,降低了各模塊之間的耦合,在改進和個性化定制界面及用戶交互的同時不需要重復編寫業(yè)務(wù)邏輯.并且多個視圖可以共享一個模型,利于后期的維護和測試.
在Java EE平臺上,JSP技術(shù)主要用于視圖層,負責與外界進行交互;servlet技術(shù)主要用于控制層,作為JSP與JavaBean之間的樞紐;JavaBean主要用于模型層,進行數(shù)據(jù)業(yè)務(wù)處理[4].
2 MVC在登錄模塊中的應(yīng)用
登錄模塊一般包含輸入用戶數(shù)據(jù)、接收用戶數(shù)據(jù)、查詢數(shù)據(jù)庫判斷用戶口令以及登錄結(jié)果顯示等.基于MVC的安全登錄模塊則將上述流程拆分到不同模塊中,并在每個模塊有針對性的對數(shù)據(jù)進行處理,進一步提高登錄模塊的安全性.
View層負責與用戶進行交互,顯示登錄界面并進行用戶信息收集,在View層中還可以對數(shù)據(jù)進行初步驗證,確保用戶輸入數(shù)據(jù)的合法性;Controller層接收用戶數(shù)據(jù)并調(diào)用模型層對數(shù)據(jù)進行二次驗證和數(shù)據(jù)處理,待數(shù)據(jù)處理完畢之后將結(jié)果返回至視圖層;Model層則專門負責業(yè)務(wù)邏輯處理,包括數(shù)據(jù)驗證、驗證碼生成、密碼加密、與數(shù)據(jù)庫進行交互等.MVC各層任務(wù)如表1所示.
3 登錄模塊安全性分析與設(shè)計
3.1 視圖層
根據(jù)View在登錄模塊中所承擔的任務(wù),該模塊所包含與用戶的交互頁面(登錄頁面login.jsp),其所面臨的安全問題主要為用戶輸入惡意或非法數(shù)據(jù)來破壞程序的穩(wěn)定性和安全性,如暴力破解、SQL注入、網(wǎng)絡(luò)監(jiān)聽.
3.1.1 暴力破解
暴力破解主要是通過窮舉法對用戶密碼進行破譯,在經(jīng)過大量嘗試之后非法登入系統(tǒng).為防止暴力破解,可以在View層添加驗證碼,其關(guān)鍵代碼如下:
其中,uri表示生成驗證碼的服務(wù)器路徑,由控制層提供,具體驗證碼生成由模型層負責.
3.1.2 SQL注入
SQL注入式攻擊一般是通過傳輸特殊字符給服務(wù)器,使得原本的SQL命令發(fā)生改變,從而欺騙服務(wù)器執(zhí)行惡意的SQL命令.為防止SQL注入,可采用預(yù)編譯的命令對象PreparedStatement來執(zhí)行SQL語句(由模型層實現(xiàn)),其次可在View層用正則表達式對特殊字符進行過濾處理,其關(guān)鍵代碼如下:
3.1.3 網(wǎng)絡(luò)監(jiān)聽
用戶關(guān)鍵數(shù)據(jù)在傳輸過程中很難避免被黑客監(jiān)聽,這就意味著黑客可以偽裝成用戶向服務(wù)器發(fā)送二次請求(重放攻擊),并獲得授權(quán)[5].為防止網(wǎng)絡(luò)監(jiān)聽,可在客戶端和服務(wù)端各持一份時間令牌,且用戶每次訪問都具有不同的時間令牌,使黑客無法模擬登錄.其View層JS關(guān)鍵代碼如下:
3.2 控制層
根據(jù)Controller在登錄模塊中所承擔的任務(wù),該模塊主要由Servlet技術(shù)實現(xiàn)(LoginServlet.java),負責對用戶數(shù)據(jù)的接收以及請求控制,其面臨的安全問題主要有接收到的數(shù)據(jù)不合法、關(guān)鍵數(shù)據(jù)不一致和請求異常等.
3.2.1 數(shù)據(jù)合法性檢驗
數(shù)據(jù)合法性檢驗可以調(diào)用模型層進行二次驗證,防止用戶繞過View層的數(shù)據(jù)檢驗.
3.2.2 數(shù)據(jù)一致性
Servlet使用線程來處理用戶請求,在擁有高效處理請求的同時易造成線程安全問題.為保證關(guān)鍵數(shù)據(jù)一致性,可對關(guān)鍵代碼加上同步鎖(synchronized),其關(guān)鍵代碼如下:
3.2.3 異常請求處理
若用戶所請求的資源地址不存在,則可在web.xml配置異常處理;若用戶所請求的資源無權(quán)限訪問,則可在控制器中加入攔截器;若用戶提交的請求數(shù)據(jù)不合法,則可使用try/catch進行異常捕獲.
3.3 模型層
根據(jù)Model層在登錄模塊中所承擔的任務(wù),該模塊主要功能有具體的數(shù)據(jù)驗證、加載驅(qū)動、讀取數(shù)據(jù)庫配置文件、連接數(shù)據(jù)庫、與數(shù)據(jù)庫進行交互以及驗證碼和安全策略的生成,其面臨的安全問題主要有與用戶數(shù)據(jù)持久化相關(guān)的安全問題和業(yè)務(wù)邏輯處理異常.
3.3.1 用戶數(shù)據(jù)持久化安全問題
用戶數(shù)據(jù)持久化安全問題包括用戶數(shù)據(jù)的合法性驗證、防止大量非人為操作、防止重放攻擊和持久化數(shù)據(jù)加密等.
用戶數(shù)據(jù)的合法性驗證可使用java.util.regex包中的API來實現(xiàn)正則表達式檢驗;防止大量非人為操作可使用java.awt.image包中的API來繪制驗證碼;防止重放攻擊可以在用戶提交的數(shù)據(jù)中混入時間令牌,其關(guān)鍵代碼如下:
3.3.2 業(yè)務(wù)邏輯處理異常
在加載驅(qū)動、讀取數(shù)據(jù)庫配置文件、連接數(shù)據(jù)庫、與數(shù)據(jù)庫進行交互的過程中可能會發(fā)生IOException、SQLException、ClassNotFoundException等異常,可使用try/catch進行異常捕獲.
4 安全性測試
為了進一步驗證登錄模塊的安全性,測試基于MVC的安全性處理方法是否有效,本文對用戶數(shù)據(jù)合法性、數(shù)據(jù)庫密碼安全性、防止SQL注入以及防止網(wǎng)絡(luò)監(jiān)聽等進行了測試.
4.1 數(shù)據(jù)合法性測試
在View層對用戶輸入的數(shù)據(jù)進行了合法性驗證,當輸入不符合要求的數(shù)據(jù)時將會提示數(shù)據(jù)信息不合法.
4.2 數(shù)據(jù)庫密碼安全性測試
對數(shù)據(jù)庫密碼進行安全性處理前后進行比對,未進行安全性處理之前的數(shù)據(jù)庫密碼進行明文顯示,如“l(fā)ucy123”,該密碼是對數(shù)據(jù)庫管理人員完全開放的,用戶的個人信息存在極大的安全隱患.而進行安全性處理之后的數(shù)據(jù)庫密碼將以32位十六進制形式顯示為“861A628F450DEF33619F6232 540441CC”,管理人員也無法獲得真實的用戶密碼.
4.3 SQL注入測試
SQL注入是開發(fā)者必須考慮的問題,若用戶在用戶名中輸入“ 'or 1 = 1--”則會將SQL語句篡改為SELECT * FROM USER WHERE username=''or 1=1--' AND password=……,--符號之后的SQL代碼將視為注釋被忽略,此時SQL就變成了SELECT * FROM USER,主要表中存在數(shù)據(jù),用戶就能直接登錄成功;經(jīng)過安全性處理之后,輸入非法字符將無法通過驗證.
4.4 防止網(wǎng)絡(luò)監(jiān)聽
防止網(wǎng)絡(luò)監(jiān)聽最有效的辦法就是一次一密,即用戶所傳輸?shù)拿艽a會隨著時間變化而變化.黑客或者非法用戶即使截獲到密碼實施重放攻擊,此時密碼也將無效,測試效果如下.
從上述測試結(jié)果可以看出未防止網(wǎng)絡(luò)監(jiān)聽時用戶密碼雖然進行了加密,但是密碼不隨時間變化,很容易被黑客監(jiān)聽并實現(xiàn)重放攻擊,采取防止網(wǎng)絡(luò)監(jiān)聽措施之后的傳輸密碼會隨著時間不停變化,實現(xiàn)一次一密,有效防止重放攻擊.
5 總結(jié)
本文對網(wǎng)站登錄模塊的安全性進行了研究與設(shè)計.從MVC的三層結(jié)構(gòu)入手,講述了視圖層、控制層以及模型層在登錄模塊安全性中所需要承擔的任務(wù)以及面臨的安全問題,并針對這些安全問題提出了相應(yīng)的解決方案和數(shù)據(jù)處理方法.經(jīng)測試對比分析,在MVC三層架構(gòu)上所提出得用戶數(shù)據(jù)安全性處理方法能有效保障用戶登錄信息安全,加強網(wǎng)站登錄模塊的安全性,提高網(wǎng)站質(zhì)量.
參考文獻:
〔1〕陳海洋.基于MVC模式的web系統(tǒng)的解決方案[D].電子科技大學,2007.
〔2〕王世偉.論信息安全、網(wǎng)絡(luò)安全、網(wǎng)絡(luò)空間安全[J].中國圖書館學報,2015,41(02):72-84.
〔3〕Reenskaug T. Thing-model-view-editor—An example from a planningsystem[J]. technical note, Xerox Parc, 1979.
〔4〕陸榮幸,郁洲,阮永良,王志強.J2EE平臺上MVC設(shè)計模式的研究與實現(xiàn)[J].計算機應(yīng)用研究,2003(03):144-146.
〔5〕甄玉磊.網(wǎng)絡(luò)控制系統(tǒng)中重放攻擊的檢測與對策[D].北京交通大學,2016.