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