防止ASP下載的終極方法

  一、開篇

  自從搞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腳本,彈出一個對話框,嚇嚇那些下載數據庫的小貓們,還不敢快試試去 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章