摘要:采用Asp+Access方案搭建服務器,簡單方便,易于管理,從而被廣泛采用。但Asp+Access解決方案在為我們帶來便捷的同時,也帶來了不容忽視的安全問題。
關鍵詞:asp;access;安全
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)09-11586-02
Analysis of Potential Safety Problems of ASP+Access and Their Counter-measures
GUO Liang1, CUI Jin-ling2
(1.Anyang Institute of Technology, Anyang 455000, China; 2.Henan Normal University, Xinxiang 453002, China)
Abstract: Asp+Access server is widely adopted for its easiness, convenience and manageability. But Access system also brings some unnegligible safety problem besides its convenience and high efficiency.
Key words: asp; access; safety
1 ASP和Access簡要介紹
ASP是Active Server Page的縮寫,意為“活動服務器網頁”。它是微軟公司開發的代替CGI腳本程序的一種應用,它可以與數據庫和其它程序進行交互,是一種簡單、方便的編程工具,常用于各種動態網站中。
Microsoft Office Access(前名 Microsoft Access)是由微軟發布的基于Windows的桌面關系數據庫管理系統(RDBMS)。它結合了Microsoft Jet Database Engine和圖形用戶界面兩項特點,是Microsoft Office的成員之一。Access能夠存取 Access/Jet、Microsoft SQL Server、Oracle,或者任何 ODBC 兼容數據庫內的資料。它提供了表、查詢、窗體、報表、頁、宏、模塊7種用來建立數據庫系統的對象;提供了多種向導、生成器、模板,把數據存儲、數據查詢、界面設計、報表生成等操作規范化;為建立功能完善的數據庫管理系統提供了方便,也使得普通用戶不必編寫代碼,就可以完成大部分數據管理的任務。
2 Asp+Access隱患分析
ASP+Access主要安全隱患來自Access數據庫的安全性,其次在于ASP網頁設計過程中的安全漏洞。
2.1 Access數據庫的存儲隱患
在ASP+Access應用系統中,如果獲得或者猜到Access數據庫的存儲路徑和數據庫名,則該數據庫就可以被下載到本地。例如:對于網上書店的Access數據庫,人們一般命名為book.mdb、store.mdb等,而存儲的路徑一般為“URL/database”或干脆放在根目錄(“URL/”)下。這樣,只要在瀏覽器地址欄中敲入地址:“URL/database/store.mdb”,就可以輕易地把store.mdb下載到本地的機器中。
2.2 Access數據庫的解密隱患
由于Access數據庫的加密機制非常簡單,所以即使數據庫設置了密碼,解密也很容易。該數據庫系統通過將用戶輸入的密碼與某一固定密鑰進行異或來形成一個加密串,并將其存儲在*.mdb文件中從地址“H42”開始的區域內。由于異或操作的特點是“經過兩次異或就恢復原值”,因此,用這一密鑰與*.mdb文件中的加密串進行第二次異或操作,就可以輕松地得到Access數據庫的密碼。基于這種原理,可以很容易地編制出解密程序。 由此可見,無論是否設置了數據庫密碼,只要數據庫被下載,其信息就沒有任何安全性可言了。
2.3 源代碼的安全隱患
由于ASP程序采用的是非編譯性語言,這大大降低了程序源代碼的安全性。任何人只要進入站點,就可以獲得源代碼,從而造成ASP應用程序源代碼的泄露。
2.4 程序設計中的安全隱患
ASP代碼利用表單(form)實現與用戶交互的功能,而相應的內容會反映在瀏覽器的地址欄中,如果不采用適當的安全措施,只要記下這些內容,就可以繞過驗證直接進入某一頁面。例如在瀏覽器中敲入“……page.asp?x=1”,即可不經過表單頁面直接進入滿足“x=1”條件的頁面。因此,在設計驗證或注冊頁面時,必須采取特殊措施來避免此類問題的發生。
3 應對方案
提高數據庫的安全性由于Access數據庫加密機制過于簡單,因此,如何有效地防止Access數據庫被下載,就成了提高ASP+Access解決方案安全性的重中之重。
3.1 非常規命名法
防止數據庫被找到的簡便方法是為Access數據庫文件起一個復雜的非常規名字,并把它存放在多層目錄下。例如,對于網上書店的數據庫文件,不要簡單地命名為“book.mdb”或“store.mdb”,而是要起個非常規的名字,例如:faq19jhsvzbal.mdb,再把它放在如“./akkjj16t/kjhgb661/acd/avccx55”之類的深層目錄下。這樣,對于一些通過猜的方式得到Access數據庫文件名的非法訪問方法起到了有效的阻止作用。
3.2 使用ODBC數據源
在ASP程序設計中,應盡量使用ODBC數據源,不要把數據庫名直接寫在程序中,否則,數據庫名將隨ASP源代碼的失密而一同失密。例如:
DBPath = Server.MapPath(\"./desselr/frdddi61/acd/avccx55/faq19jhsvzbal.mdb\") conn.Open \"driver={Microsoft Access Driver (*.mdb)};dbq=\"DBPath
可見,即使數據庫名字起得再怪異,隱藏的目錄再深,ASP源代碼失密后,數據庫也很容易被下載下來。如果使用ODBC數據源,就不會存在這樣的問題了:
conn.open \"ODBC-DSN名\"
3.3 對ASP頁面進行加密
為有效地防止ASP源代碼泄露,可以對ASP頁面進行加密。一般有兩種方法對ASP頁面進行加密。一種是使用組件技術將編程邏輯封裝入DLL之中;另一種是使用微軟的Script Encoder對ASP頁面進行加密。使用組件技術存在的主要問題是每段代碼均需組件化,操作比較煩瑣,工作量較大;而使用Script Encoder對ASP頁面進行加密,操作簡單、收效良好。
Script Encoder方法具有許多優點:
(1)HTML仍具有很好的可編輯性。Script Encoder只加密在HTML頁面中嵌入的ASP代碼,其他部分仍保持不變,這就使得我們仍然可以使用FrontPage或Dreamweaver等常用網頁編輯工具對HTML部分進行修改、完善,只是不能對ASP加密部分進行修改,否則將導致文件失效。
(2)操作簡單。只要掌握幾個命令行參數即可。Script Encoder的運行程序是screnc.exe,其使用方法如下:
screnc [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile 其中的參數含義如下:
s:屏蔽屏幕輸出;
f:指定輸出文件是否覆蓋同名輸入文件;
xl:是否在.asp文件的頂部添加@Language指令;
l:defLanguag指定缺省的腳本語言;
e:defExtension 指定待加密文件的擴展名。
(3)可以批量加密文件。使用Script Encoder可以對當前目錄中的所有的ASP 文件進行加密,并把加密后的文件統一輸出到相應的目錄中。
Script Encoder是免費軟件。該加密軟件可以從微軟網站下載。
4 利用Session對象進行注冊驗證
為防止未經注冊的用戶繞過注冊界面直接進入應用系統,可以采用Session對象進行注冊驗證。Session對象最大的優點是可以把某用戶的信息保留下來,讓后續的網頁讀取。
例如設計要求用戶注冊成功后系統啟動hrmis.asp?page=1頁面。如果不采用Session對象進行注冊驗證,則用戶在瀏覽器中敲入“URL/hrmis.asp?page=1”即可繞過注冊界面,直接進入系統。利用Session對象可以有效阻止這一情況的發生。相關的程序代碼如下:
<% ' 讀取用戶輸入的賬號和密碼
UserID = Request(\"UserID\")
Password = Request(\"Password\")
' 檢查UserID 及 Password 是否正確(實際程序可能會比較復雜)
If UserID <> \"hrmis\" Or Password <>
\"password\" Then
Response.Write \"賬號錯誤!\"
Response.End
End If
'將Session 對象設置為通過驗證狀態
Session(\"Passed\") = True
%>
進入應用程序后,首先進行驗證:
<% '如果未通過驗證,返回Login狀態
If Not Session(\"Passed\") Then
Response.Redirect \"login.htm\"
End If
%>
參考文獻:
[1] 章雅娟, 趙艷平. 淺談Web數據庫[J]. 甘肅科技,2006,(06).
[2] 張文增, 林曉森, 趙冬斌, 孫振國, 陳強. ASP網站安全研究[J]. 計算機工程,2002,(03).