自從搞ASP+ACCESS沒少為避免數(shù)據(jù)庫下載而傷過神,網(wǎng)上的奇淫技巧更是數(shù)不勝數(shù),本文就是同大家共同探討各路前輩的留下的秘笈并指中其中的優(yōu)劣,最后為大家提供一種最佳的解決方案。
一、開篇
自從搞ASP+ACCESS沒少為避免數(shù)據(jù)庫下載而傷過神,網(wǎng)上的奇淫技巧更是數(shù)不勝數(shù),本文就是同大家共同探討各路前輩的留下的秘笈并指中其中的優(yōu)劣,最后為大家提供一種最佳的解決方案
二、剖析
為了防止ACESS數(shù)據(jù)庫下載,小的見過不少方法,主要有以下幾種:
1、數(shù)據(jù)庫加密--------這個自然不用說了,別人如果知道數(shù)據(jù)庫路徑,照樣能下載,打開數(shù)據(jù)庫其實也很簡單,網(wǎng)上破解ACCESS數(shù)據(jù)庫的密碼軟件太多了,以前我也有所研究,97版的ACCESS的密碼是從文件的開頭第73(如果這個數(shù)字沒記錯的話)個字符開始連續(xù)的十多個,這個是密碼與已知的一串字符異和的結(jié)果,2000版的ACCESS變聰明了一些它的加密后的密碼不是連續(xù)是間隔的不過加密密鑰還是一樣的,由于是對稱加密所以破解ACCESS簡直易如反掌(呵呵,好像跑題了)
2、數(shù)據(jù)庫文件名更名--------這個用的比較多,主要是用到了HTML的錨點,將數(shù)據(jù)庫的文件名中加入“#”,如果直接敲入數(shù)據(jù)庫的路徑試圖下載的話,由于瀏覽器只解析到了#前面一大串URL,#后被認為是錨點標記,數(shù)據(jù)路徑被保護起來了。剛看到這種方法時,俺確實得佩服最初發(fā)現(xiàn)這個方法的N人。可惜沒多久,在網(wǎng)上看到了另一篇文章對此方法的破解,原理很簡單,字符“#”被URL解析后的字符應(yīng)該是“%35”,這就是我們在地址欄里經(jīng)常看到%20樣的東西,其實是空格,由于進行了URL編碼所以解析成了%20(20是因為空格的ASC碼值為20)
3、數(shù)據(jù)庫擴展名更名--------這個用的太普遍了,擴展名一般改成.ASP,因為擴展名為。ASP文件都要交給ASP。DLL文件解釋執(zhí)行,ASP。DLL只會解釋在<%%>之間的代碼(還有<script runat=server></script>,其它的一概不管,原封不動地交給瀏覽器處理,所以直接把擴展名改為ASP后,數(shù)據(jù)不會被下載,但是會被瀏覽器直接打開.這樣別人將內(nèi)容拷貝后仍然可以還原成原始的MDB文件。
三 解決
大家應(yīng)該比較了解動網(wǎng)論壇,他的數(shù)據(jù)庫里有一個NotDown的表,這個表只有一個字段,并且這個字段的類型是OLE型,用于存放二進制的數(shù)據(jù),這個表有什么作用呢?呵呵...
把動網(wǎng)的數(shù)據(jù)庫擴展名改成ASP,然后在瀏覽器里輸入對應(yīng)路徑的數(shù)據(jù)庫地址,看到什么了?一串錯誤的ASP腳本錯誤的信息,當然數(shù)據(jù)庫也沒辦法DOWN下來了,為什么會這樣呢,那個NotDown表究竟存放的是什么呢??
大家好好看看第二節(jié)中的第3種方法,仔細琢磨一下應(yīng)該不難明白結(jié)論,正是因為NotDown表是有類似這樣的腳本致使ASP.DLL把它當作真正的ASP文件來執(zhí)行,但是這恰恰是動網(wǎng)數(shù)據(jù)庫故意安排的語法錯誤,致使ASP.DLL解釋里出錯,因而把ASP出錯信息顯示出來,從而保護了真正的數(shù)據(jù).
四 實踐
NotDown表中倒底寫了些什么呢??呵呵,是不是有點急了.
我們知道NotDown表由于是二進制字段,所有我們讀寫數(shù)據(jù)庫的時候,也要改一改常規(guī),ADO中專門有讀寫二進制字段的方法它們分別是AppendChunk 和GetChunk 有了這兩個方法我們就可以看看那個表里面究竟是啥玩意了
<%
------此處省略連接數(shù)據(jù)200字,得到數(shù)據(jù)連接對象Conn
set rs=server.createobject("adodb.recordset"
sql="select notdown from NotDown"
rs.open sql,0,1
data=rs(0).GetChunk(rs(0).ActualSize) 讀出所有的二進制數(shù)據(jù)
rs.close
set rs=nothing
----關(guān)閉數(shù)據(jù)庫連接
response.BinaryWrite(data)由于data是二進制,所以要調(diào)用response打印二進制的方法將其輸出
%>
過足癮了吧,想知道結(jié)果是什么嗎,趕緊回去調(diào)試看看啊
五 改進
上面的方法雖然是保住了數(shù)據(jù)庫,但是有個錯誤的提示,總是覺得有點不爽,我們來改點別的
如果試圖輸入數(shù)據(jù)庫的地址來下載數(shù)據(jù)庫,將會自動跳轉(zhuǎn)到搜狐網(wǎng)站,代碼如下
<%
------此處省略連接數(shù)據(jù)200字,得到數(shù)據(jù)連接對象Conn
set rs=server.createobject("adodb.recordset")
sql="select notdown from NotDown"
str="<%response.redirect(""http://www.sohu.com"""&chr(37)&">"
由于字段是二進制數(shù)據(jù),我們要是直接把Str字符串字入數(shù)據(jù)庫的話會有一點問題
在VBS中每一個字符占兩個字節(jié),所以我們要去掉高位的空字節(jié)
for i=1 to lenb(str)
if midb(str,1,i)<>0 then
data=data+ascb(midb(str,1,i))
end if
next
rs.open sql,0,3
data=rs(0).AppendChunk(data) 寫入二進制數(shù)據(jù)
rs.update
rs.close
set rs=nothing
%>
OK了,看看運行效果,甚至還可以加入一段JS腳本,彈出一個對話框,嚇嚇那些下載數(shù)據(jù)庫的小貓們,還不敢快試試去
作者:taia