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中有如下一条语句: |
<html> <body> |
<% |
Response.Write“ 123456” |
% > |
</body></html> |
在 DOS方式下运行加密命令 : screnc c:backiistest.asp c:backiistestenc.asp |
在 testenc.asp中保存加密后代码,代码如下: |
<html><body> |
<%# @~ ^IQAAAA==7@# @& 7"+ kwW/? ? MkO+ ,Jq+ 2c*+ E@# @& YQcAAA==^#~ @% > |
</body></html> |
将 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来实现。 |
结束语 |
本文简单介绍了笔者了解和使用的保护 ASP脚本源代码的方法。可能还有更多更好的方法,但愿本文能起到抛砖引玉的作用。 |