ASP是基于 Server端的腳本運行環境,它簡單易用,不需要編譯和連接,腳本可以在 Server端直接運行,并且它支持多用戶、多線程,在 Web開發中得到了廣泛的應用。
但是,因為 ASP腳本是純文本格式,所以惡意者通過源代碼可以很容易地看到原本不該看到的頁面內容。例如, ASP源代碼中通常有系統數據庫的連接用戶名和口令,惡意者利用此用戶名和口令可以輕松地查看數據庫中的所有信息(包括系統機密信息),還可能篡改庫中信息,造成系統嚴重損壞。因此,保護 ASP腳本的源代碼顯得非常重要。
保護 ASP腳本源代碼通常可采用 3種方式:第一種方式是對訪問用戶進行限制,禁止非法用戶訪問;第二種方式是對 Server端環境進行處理,提高系統的健壯性;第三種方式是對源代碼進行加工,隱藏或部分隱藏腳本源代碼。這 3種方式互為補充,有效設置可以提高腳本源代碼的安全性。下面簡單介紹這 3種方式的實現方法。
限制訪問用戶
所謂限制訪問用戶是指只有授權的用戶才能訪問系統的 ASP腳本。這主要有兩種實現方法:第一種方法是通過 SSL( Secure Socket Layer)方法, Server端向 Client端發放證書(可以利用免費證書管理軟件), Client端將證書添加到瀏覽器中,只有擁有合法證書的用戶才能與 Server端建立鏈接,從而訪問系統。這種方法不需要編程,安全性較高,但證書的下發比較麻煩。另一種方法是通過常用的驗證用戶名、口令方法,用戶登錄時必須首先輸入用戶名和口令,只有合法的用戶名和口令才能訪問系統。這種方法安全性稍低,編程比較簡單。而且在實現時需要注意:不能簡單地在登錄窗口進行判別,因為如果用戶知道了登錄窗口下一步鏈接的文件名,可以直接在地址欄輸入該文件名而繞過登錄窗口。編程時可以在除登錄窗口文件外的每個文件的開頭檢查 Request(“ HTTP_REFERENCE“)項的 IP地址,看其是否是由系統內部的文件跳轉而來,如不是則跳轉到登錄窗口。代碼如下:
<%
dim iValid
iValid=instr(Request(“ HTTP_REFERENCE“),
“ http://131.252.88.71“)
if iValid= 0 then
Response.Redirect“ login.asp“
end if
......
% >
對 Server端進行處理
對 Server端進行處理主要有 3種方法:
●對系統權限進行設置
對 Server端設置詳細的安全權限,除了系統管理員,盡量降低用戶的存取權限;刪除不必要的共享,包括打印機的共享;關閉匿名服務等一些不必要的功能;對 ASP源代碼的目錄設置詳盡的訪問權限,關閉“讀”權限。
●經常下載安全補丁
一些惡意者經常利用系統的安全缺陷得到 ASP腳本的源代碼。例如,利用 ::$ DATA可以得到 ASP腳本的源代碼,或利用 Windows NT的一些安全缺陷可以登錄到系統,查看系統的目錄和文件,所以需要經常下載并安裝微軟公司提供的安全補丁。
●盡量不要在系統中下載、安裝不必要的軟件
一些下載軟件帶有“后門”,會將腳本源代碼泄露。例如,微軟有一個專門查看 ASP腳本源代碼的程序 code.asp,如果把它放到 Web服務器上,別人可以很容易地查看 ASP腳本源代碼(網上有不少類似免費軟件)。
處理 ASP腳本源代碼
對 ASP腳本源代碼進行處理主要有兩種方法:
●對 ASP腳本源代碼進行加密
利用微軟的 Windows Script Encoder,可以對 ASP腳本源代碼進行加密。不過客戶端加密后,只有 IE 5才能執行;服務器端腳本加密后,只有服務器上安裝有 Script Engine 5才能執行。
Windows Script Encoder是一個簡單的命令行加密工具,可以利用它加密 ASP腳本的源代碼。加密后,無論 Server端和 Client端都無法讀懂加密后的信息,如果改動加密后的信息,腳本就無法正常運行,從而有效地保護了 ASP腳本源代碼。
例如 ASP文件 Test.asp中有如下一條語句:
<%
Response.Write“ 123456”
% >
在 DOS方式下運行加密命令 : screnc c:\backiis\test.asp c:\backiis\testenc.asp
在 testenc.asp中保存加密后代碼,代碼如下:
<%# @~ ^IQAAAA==7@# @& 7“+ kwW/? ? MkO+ ,Jq+ 2c*+ E@# @& YQcAAA==^! @% >
將 test.asp文件保存到另外一臺機器上, Client端可以正常訪問 testenc.asp(訪問是透明的,就像訪問 test.asp一樣 ),但無論 Server端和 Client端都無法查看 test.asp腳本源代碼。
●將 ASP中的關鍵功能制作成動態鏈接庫,部分隱藏 ASP腳本源代碼
在 VB 6.0中建立一個 ActiveX dll工程(設置工程名: Example,類名: GerRec)。在菜單中選擇“工程”,然后選擇引用“ Microsoft Active Server Pages Object Library”和“ Microsoft ActiveX Data Object 2.0 Library”。輸入如下代碼:
Private MyScriptingContext As ScriptingContext
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub
Public Sub OnEndPage()
Set MyScriptingContext = Nothing
Set MyApplication = Nothing
Set MyRequest = Nothing
Set MyResponse = Nothing
Set MyServer = Nothing
Set MySession = Nothing
End Sub
Public Sub SayTitle(strTitle as string)
MyResponse.Write strTitle
......
End Sub
Public Function GetRecSqlOleDb(strSql As String) As Recordset
’利用 OLEDB打開一個 SQL7.0數據庫,返回數據記錄
Dim myCnn As Connection
Dim mySet As Recordset
Dim strConnstring As String
Set myCnn = New ADODB.Connection
Set mySet = New ADODB.Recordset
strConnstring=“ Provider=SQLOLEDB.1;Password=1234567;”&“ Persist Security Info=True;User ID=sa;”&“ Initial Catalog=vlog;”&“ Data Source=hplh3;Connect Timeout=15”
myCnn.ConnectionString = strConnstring
myCnn.Open
mySet.ActiveConnection = myCnn
mySet.Open strSql
Set GetRecSqlOleDb = mySet
End Function
編譯生成 Example.dll,然后在 InterDev中插入如下代碼:
<%
dim MyRec
Set ObjReference=Server.CreateObject
(“ Example.GerRec” )
set MyRec=Server.CreateObject(“ ADODB.Recordset” )
Set MyRec=objReference.GetRecSqlOleDb(“ select* from catalog” )
Response.Write MyRec.fields(0)
% > 在 Client端訪問這個 ASP文件將顯示第一條記錄的第一個字段內容。該例子通過動態鏈接庫將對數據庫的訪問隱藏起來,即使有人得到了 ASP源代碼,他也不可能通過 ASP源代碼得到數據庫的用戶名和口令,從理論上講,所有的 ASP源代碼都可以用 dll來實現。
|