随著(zhe)Internet的(de)發展,Web技術日新月(yuè)異,人(rén)們已經不再滿足于靜态HTML技術,更多(duō)的(de)是要求動态、交互的(de)網絡技術。繼通(tōng)用(yòng)網關接口(CGI)之後,微軟推出的(de)IIS+ASP的(de)解決方案作爲一種典型的(de)服務器端網頁設計技術,被廣泛應用(yòng)在網上銀行、電子商務、網上調查、網上查詢、BBS、搜索引擎等各種互聯網應用(yòng)中。與此同時(shí),Access數據庫作爲微軟推出的(de)以标準JET爲引擎的(de)桌面型數據庫系統,由于具有操作簡單、界面友好等特點,具有較大(dà)的(de)用(yòng)戶群體。目前,IIS+ASP+Access是中小型Internet網站的(de)首選方案。但是,該解決方案在爲我們帶來(lái)便捷的(de)同時(shí),也(yě)帶來(lái)了(le)嚴峻的(de)安全問題。
一、安全隐患分(fēn)析
IIS+ASP+Access解決方案的(de)主要安全隐患來(lái)自Access數據庫的(de)安全性,其次在于ASP網頁設計過程中的(de)安全意識和(hé)措施。
1.數據庫可(kě)能被下(xià)載
在IIS+ASP+Access網站中,如果有人(rén)通(tōng)過各種方法獲得(de)或者猜到數據庫的(de)存儲路徑和(hé)文件名,則該數據庫就可(kě)以被下(xià)載到本地。例如:對(duì)于網上書(shū)店(diàn)數據庫,一般命名爲book.mdb、store.mdb等,存儲路徑一般爲“URL/database”或放在根目錄“URL/”下(xià),這(zhè)樣,任何人(rén)敲入地址:“URL/database/store.mdb”, 數據庫就可(kě)以被下(xià)載了(le)。
2.數據庫可(kě)能被解密
由于Access數據庫的(de)加密機制比較簡單,即使設置了(le)密碼,解密也(yě)很容易。該數據庫系統通(tōng)過将用(yòng)戶輸入的(de)密碼與某一固定密鑰(例如: Access 97爲86 FB EC 37 5D 44 9C FA C6 5E 28 E6 13)進行“異或”來(lái)形成一個(gè)加密串,并将其存儲在*.mdb文件從地址“&H42”開始的(de)區(qū)域内。我們可(kě)以輕松地編制解密程序,一個(gè)幾十行的(de)小程序就可(kě)以輕松地獲得(de)任何Access數據庫的(de)密碼。因此,隻要數據庫被下(xià)載,其信息就沒有任何安全性可(kě)言了(le)。
3.ASP頁面的(de)安全性
(1)源代碼安全性隐患。由于ASP程序采用(yòng)非編譯性語言,大(dà)大(dà)降低了(le)程序源代碼的(de)安全性。如果黑(hēi)客侵入站點,就可(kě)以獲得(de)ASP源代碼;同時(shí)對(duì)于租用(yòng)服務器的(de)用(yòng)戶,因個(gè)别服務器出租商的(de)職業道德問題,也(yě)會造成ASP應用(yòng)程序源代碼洩露。
(2)程序設計中容易被忽視的(de)安全性問題。ASP代碼使用(yòng)表單實現交互,而相應的(de)内容會反映在浏覽器的(de)地址欄中,如果不采用(yòng)适當的(de)安全措施,隻要記下(xià)這(zhè)些内容,就可(kě)以繞過驗證直接進入某一頁面。例如在浏覽器中敲入“...page.asp?x=1”,即可(kě)不經過表單頁面直接進入滿足“x=1”條件的(de)頁面。因此,在驗證或注冊頁面中,必須采取特殊措施來(lái)避免此類問題的(de)産生。
二、提高(gāo)IIS+ASP網站安全性的(de)方法
1.防止數據庫被下(xià)載
由于Access數據庫加密機制過于簡單,有效地防止數據庫被下(xià)載,就成了(le)提高(gāo)ASP+Access解決方案安全性的(de)重中之重。以下(xià)兩種方法簡單、有效。
(1)非常規命名法。爲Access數據庫文件起一個(gè)複雜(zá)的(de)非常規名字,并把它放在幾個(gè)目錄下(xià)。例如,對(duì)于網上書(shū)店(diàn)的(de)數據庫,我們不把它命名爲“book.mdb”或“Store.mdb”,而是起個(gè)非常規的(de)名字,例如:faq9jl.mdb,再把它放在如./akkt/kj61/acd/av5 的(de)幾層目錄下(xià),這(zhè)樣黑(hēi)客想通(tōng)過猜的(de)方式得(de)到Access數據庫文件名就很難了(le)。
(2)使用(yòng)ODBC數據源。在ASP程序設計中,如果有條件,應盡量使用(yòng)ODBC數據源,不要把數據庫名寫在程序中,否則,數據庫名将随ASP源代碼的(de)失密而一同失密,例如:
DBPath = Server.MapPath(“./akkt/kj61/acd/av5/faq9jl.mdb ”)
conn.open “driver={Microsoft Access Driver (*.mdb)};dbq=”& DBPath
可(kě)見,即使數據庫名字起得(de)再怪異,隐藏的(de)目錄再深,ASP源代碼失密後,也(yě)很容易被下(xià)載下(xià)來(lái)。如果使用(yòng)ODBC數據源,就不會存在這(zhè)樣的(de)問題了(le):
conn.open “ODBC-DSN名”
2.對(duì)ASP頁面進行加密
爲有效地防止ASP源代碼洩露,可(kě)以對(duì)ASP頁面進行加密。我們曾采用(yòng)兩種方法對(duì)ASP頁面進行加密。一是使用(yòng)組件技術将編程邏輯封裝入DLL之中;二是使用(yòng)微軟的(de)Script Encoder對(duì)ASP頁面進行加密。使用(yòng)組件技術存在的(de)主要問題是每段代碼均需組件化(huà),操作比較繁瑣,工作量較大(dà),而使用(yòng)Encoder對(duì)ASP頁面進行加密,操作簡單、收效良好。Script Encoder的(de)運行程序是SCRENC.EXE,使用(yòng)方法是:
SCRENC [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile
其中:/s 是屏蔽屏幕輸出;/f 指定輸出文件是否覆蓋同名輸入文件;/xl 指是否在.asp文件的(de)頂部添加@Language指令;/l defLanguag指定缺省的(de)腳本語言; /e defExtension 指定待加密文件的(de)擴展名。
3.注冊驗證
爲防止未經注冊的(de)用(yòng)戶繞過注冊界面直接進入應用(yòng)系統,我們采用(yòng)Session對(duì)象進行注冊驗證。例如,我們制作了(le)下(xià)面的(de)注冊頁面。
設計要求注冊成功後系統啓動hrmis.asp?page=1頁面。假設,不采用(yòng)Session對(duì)象進行注冊驗證,則用(yòng)戶在浏覽器中敲入“URL/hrmis.asp?page=1”即可(kě)繞過注冊界面,直接進入系統。
在此,利用(yòng)Session對(duì)象進行注冊驗證:
〈%
’讀取使用(yòng)者所輸入的(de)賬号和(hé)密碼
UserID = Request(“UserID”)
Password = Request(“Password”)
’檢查UserID 及Password 是否正确
If UserID 〈〉“hrmis” Or Password 〈〉“password” Then
Response.Write “賬号錯誤!”
Response.End
End If
’将Session 對(duì)象設置爲通(tōng)過驗證狀态
Session(“Passed”) = True
%〉
進入應用(yòng)程序後,首先進行驗證:
〈%
’如果未通(tōng)過驗證,返回Login狀态
If Not Session(“Passed”) Then
Response.Redirect “Login.asp”
End If
%〉
通(tōng)過對(duì)IIS+ASP+Access網上應用(yòng)系統安全性的(de)研究,我們對(duì)現有系統進行了(le)改造,收到了(le)較好的(de)效果。