| 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脚本源代码的方法。可能还有更多更好的方法,但愿本文能起到抛砖引玉的作用。 |