保护ASP脚本源代码
所谓"web源代码",指的是客户端的诸如HTML,
javascript之类的东东,当你辛辛苦苦写出来一个web应用程序时,可能希望自己
作为全球最大的软件商,微软公司也意识到了脚本的知识产权保护问题,因此在ie5以上的版本里加入了对编码脚本的支持,这里 http://www.haodf.net/networksecurity/encrypt/200610/181465.html
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:ackiis est.asp c:ackiis estenc.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来实现。