眾所周知,asp+access最大的安全隱患在於access資料庫可以被別人
下載,而現在提供的很多asp空間都是只支援access資料庫,這樣一來,
asp+access的安全問題就顯得很突出了。
1.Access資料庫的儲存隱患
在ASP+Access應用系統中,如果獲得或者猜到Access資料庫的儲存路
徑和資料庫名,則該資料庫就可以被下載到本地。
2.Access資料庫的解密隱患
由於Access資料庫的加密機制非常簡單,所以即使資料庫設定了密碼,
解密也很容易。該資料庫系統通過將使用者輸入的密碼與某一固定密鑰進行
異或來形成一個加密串,並將其儲存在*.mdb檔案中從地址“&H42”開
始的地區內。由於異或操作的特點是“經過兩次異或就恢複原值”,因
此,用這一密鑰與*.mdb檔案中的加密串進行第二次異或操作,就可以輕
松地得到Access資料庫的密碼。基於這種原理,可以很容易地編製出解密
程式。
由此可見,無論是否設定了資料庫密碼,只要資料庫被下載,其資訊就沒有任何安全性可言了。
3.程式設計中的安全隱患
ASP代碼利用表單(form)實現與使用者互動的功能,而相應的內容會反
映在瀏覽器的地址欄中,如果不採用適當的安全措施,只要記下這些內
容,就可以繞過驗證直接進入某一頁面。例如在瀏覽器中敲入“……
page.asp?x=1”,即可不經過表單頁面直接進入滿足“x=1”條件的頁
面。因此,在設計驗證或註冊頁面時,必須採取特殊措施來避免此類問題
的發生。
==========
解決方案
==========
提高資料庫的安全性
由於Access資料庫加密機制過於簡單,因此,如何有效地防止Access
資料庫被下載,就成了提高ASP+Access解決方案安全性的重中之重。
1.非常規命名法
防止資料庫被找到的簡便方法是為Access資料庫檔案起一個複雜的非常
規名字,並把它存放在多層目錄下。例如,對於網上書店的資料庫檔案,
不要簡單地命名為“book.mdb”或“store.mdb”,而是要起個非常規的
名字,例如:faq19jhsvzbal.mdb,再把它放在
如./akkjj16t/kjhgb661/acd/avccx55 之類的深層目錄下。這樣,對於
一些通過猜的方式得到Access資料庫檔案名的非法存取方法起到了有效
阻止作用。
2.使用ODBC資料來源
在ASP程式設計中,應盡量使用ODBC資料來源,不要把資料庫名直接寫在
程式中,否則,資料庫名將隨ASP原始碼的失密而一同失密。例如:
DBPath = Server.MapPath(“./akkjj16t/
kjhgb661/acd/avccx55/faq19jhsvzbal.mdb ”)
conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=” & DBPath
可見,即使資料庫名字起得再怪異,隱藏的目錄再深,ASP原始碼失密
後,資料庫也很容易被下載下來。如果使用ODBC資料來源,就不會存在這樣
的問題了:
conn.open “ODBC-DSN名”
對ASP頁面進行加密
為有效地防止ASP原始碼泄露,可以對ASP頁面進行加密。一般有兩種方
法對ASP頁面進行加密。一種是使用組件技術將編程邏輯封裝入DLL之中;
另一種是使用微軟的Script Encoder對ASP頁面進行加密。但是,使用組
件技術存在的主要問題是每段代碼均需組件化,操作比較煩瑣,工作量較
大;而使用Script Encoder對ASP頁面進行加密,操作簡單、收效良好。
Script Encoder方法具有許多優點:
⑴.HTML仍具有很好的可編輯性。Script Encoder只加密在HTML頁面中
嵌入的ASP代碼,其他部分仍保持不變,這就使得我們仍然可以使用
FrontPage或Dreamweaver等常用網頁編輯工具對HTML部分進行修改、完
善,只是不能對ASP加密部分進行修改,否則將導致檔案失效。
⑵.操作簡單。只要掌握幾個命令列參數即可。Script Encoder的運行
程式是screnc.exe,其使用方法如下:
screnc [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile
其中的參數含義如下:
s:屏蔽螢幕輸出;
f:指定輸出檔案是否覆蓋同名輸入檔案;
xl:是否在.asp檔案的頂部添加@Language指令;
l:defLanguag指定預設的指令碼語言;
e:defExtension 指定待加密檔案的副檔名。
⑶.可以大量加密檔案。使用Script Encoder可以對目前的目錄中的所有
的ASP 檔案進行加密,並把加密後的檔案統一輸出到相應的目錄中。例
如:
screnc *.asp c:\temp
⑷. Script Encoder是免費軟體。該加密軟體可以從微軟網站下載:
http://msdn.microsoft.com/scripting/vbscript/download/x86/sce10en.exe。下載後,運行安裝即可。
利用Session對象進行註冊驗證
為防止未經註冊的使用者繞過註冊介面直接進入應用系統,可以採用Session對象進行註冊驗證。Session對象最大的優點是可以把某使用者的資訊保留下來,讓後續的網頁讀取。
3.改資料庫副檔名
你也可以將資料庫的副檔名改為.asp,當然在定位元據庫的時候也要
用類似database.asp的檔案名稱,這樣資料庫不會被輕易的下載,而資料
還可以正常的讀出寫入。
4.向資料庫內加錯誤的asp代碼
如果以為做完第3項以後就萬事大吉了那就錯了,雖然資料庫的副檔名
變成了.asp,但是當對方猜到了你的資料庫路徑以後還是可以下載的,只
不過慢了一些,對方可以等頁面完全開啟以後“另存新檔”就可以了。要解
決這個問題可以載資料庫內添加錯誤的asp代碼。你可以先建立一個隱藏
表,表內只有一列,並且插入這樣一行:
這樣一來對方開啟資料庫的頁面時就只會出現asp指令碼的錯誤資訊,而不
會下載你的資料庫了。
5.對於程式設計中隱患的解決一例
大多數人都認為網站只要加了登入密碼就無法正常進入了。而請您看下
面的驗證語句:
sql="select uname,pwd from uinfo where "
sql=sql&"uname='"&request.form("uname")&"'"
sql=sql&" and pwd='"&request.form("pwd")&"'"
rs.open sql,conn,1,1
if rs.eof or rs.bof then
response.write "對不起,錯誤的使用者名稱/密碼!"
else
response.write "登入成功!"
end if
可能已經有讀者看出來了這段代碼是十分危險的,只要對方知道使用者名稱就
可以登入,你可以在密碼框裡輸入“' or '1'='1”就可以了,其原理很
簡單,就是利用了sql查詢語句,大家注意,用此方法提交以後的sql語句
變成了:(如果使用者名稱為administrator)
select uname,pwd from uinfo where uname='administrator' and pwd='' or '1'='1'
如果使用者名稱administrator存在的話那麼這個記錄是可以被選出來的,之
後當然就是可以正常登入了。
解決方案:
sql="select uname,pwd from uinfo where "
sql=sql&"uname='"&request.form("uname")&"'"
rs.open sql,conn,1,1
if rs.eof or rs.bof then
response.write "對不起,本站沒有此使用者!"
else
if rs.fields("pwd")=trim(request.form("pwd")) then
response.write "登入成功!"
else
response.write "錯誤的使用者名稱/密碼!"
end if
end if