ISAPI筛选器及对ASP源文件的保护

时间:2023-11-26 09:44:02

ISAPI筛选器及对ASP源文件的保护 2009-04-21 01:45:57

摘要:本文介绍了利用ISAPI筛选器保护ASP源文件的方法,并给出一个实例。
关键字   IIS,ISAPI,ASP,代码保护
1 引言
ASP作为一种网络开发的脚本语言,由于编程简单、功能强大,得到了广泛的应用。然而,由于ASP脚本是采用明文(plain text)方式来编写的,所以应用开发商辛苦开发出来的ASP应用程序,一旦发布到运行环境中去后,就很难确保这些"源代码"不会被流传出去。这样就产生 了如何有效地保护开发出来的ASP脚本源代码的需求。
对于ASP源代码保护的常用方法主要有两种:
(1)使用微软提供的官方加密程序加密。该程序可以从微软免费下载,安装后生成screnc.exe文件,这是一个运行在DOS PROMAPT的命令工具。使用该程序加密后,ASP脚本变成不可阅读的密文。加密后的ASP文件在IIS5.0下可直接运行,因而使用非常方便。但是, 在微软提供加密程序后很快就出现了解密程序,解密程序能完全恢复源代码,使加密形同虚设,不能说不是一种遗憾。
(2)使用ASP组件,即ASP文件中只编写尽可能少的源代码,将核心代码脚本部分被封装到一个COM/DCOM组件,并在ASP脚本中创建该 组件,进而调用相应的方法。因此,需要在开发ASP脚本应用之前就可按此思路来开发,或者直接用ASP 脚本快速开发出原型系统后,针对需要保护、加密的重要脚本用COM/DCOM组件来重新开发、实现并替换。但该方法给开发调试带来诸多不便,因此一般只对 最主要的代码采用这种方式。
鉴于上述两种方法的不足,本文研究了使用ISAPI的IIS筛选器的方法。该方法的基本思想是,开发过程中仍然使用按源代码方式进行,程序发布 前将脚本进行加密处理,程序发布后给IIS添加一个筛选器。利用筛选器与IIS的紧密结合特性,在ASP.DLL读取脚本前还原加密程序。其特点是,脚本 的开发与加密分离,加密方式可以自行决定,筛选器只能起到还原密文的功能。
2  ISAPI 筛选器的构成
ISAPI筛选器是微软针对IIS提供的专用API,提供了对IIS 的纵向扩充功能。ISAPI筛选器和HTTP 服务器运行在同一地址空间,并且可以访问可由 HTTP 服务器使用的所有资源。ISAPI筛选器随IIS启动而加载,客户机的每个HTTP请求都会导致筛选器执行,并且IIS处理HTTP请求的各个阶段都会产 生一个通知,从而调用筛选器处理相应事件。
ISAPI筛选器
IIS服务器
处理连接请求标题
处理连接请求数据
将URL映射成物理路径
授权用户(如果需要)
组织数据
写入日志
结束连接
OnReadRawData
OnPreprocHeaders
OnUrlMap
OnAuthentication
OnSendRawData
OnEndOfNetSession
发送给客户机
OnLog

图1显示了IIS服务器从接收到客户机请求数据到结束连接整个过程中IIS的处理步骤,以及筛选器可以获得的通知和处理方式。

图1 IIS服务器与筛选器工作流程
使用 MFC 的 CHttpFilter 类创建筛选器来管理 ISAPI 服务器的传入和输出数据时,使用两个入口点成员函数 CHttpFilter::GetFilterVersion 和 CHttpFilter::HttpFilterProc 。
⑴ GetFilterVersion
当IIS启动时,它读取该值并加载筛选器。然后它调用 CHttpFilter::GetFilterVersion
交换版本信息、确定请求的事件及指定传递请求事件的优先级。本文用到两个确定请求的事件,即SF_NOTIFY_URL_MAP和
SF_NOTIFY_SEND_RAW_DATA,用于将逻辑 URL
映射到物理路径时获得加密文件和将原始数据从服务器发送到客户端之前通知筛选器以删除解密文件
⑵ HttpFilterProc
当事件发生时,服务器通过调用筛选器的 HttpFilterProc 入口点通知筛选器。当
CHttpFilter::HttpFilterProc 被调用时,接收到的通知将确定将要调用哪一个 CHttpFilter 成员函数。通过重写
HttpFilterProc 成员函数时,可以使筛选器以特定的方式处理数据。本文涉及两个成员函数。
OnUrlMap   在服务器将逻辑 URL 映射到物理路径时通知筛选器执行。
OnSendRawData   在将原始数据从服务器发送到客户端之前通知筛选器执行。
3 实现ASP源代码保护过程
ASP的开发调试完成后可以通过自行设计的加密方法进行加密,通过加密变为密文文件。客户机访问密文文件时,首先通过IIS筛选器解密还原为
ASP源代码,然后再将ASP源代码交给ASP解释器解释执行,该过程在服务器将逻辑 URL
映射到物理路径时完成,即重写HttpFilterProc的成员函数OnUrlMap。处理方法如下:
筛选器得到通知后,判断是否ASP请求,决定是否对文件处理
    CString isasp,ext;
         isasp=pMapInfo->pszPhysicalPath;  //获得密文位置
    ext=isasp.Right(3);        ext.MakeUpper() ;
         if(!(ext=="ASP")) return SF_STATUS_REQ_NEXT_NOTIFICATION;
打开获得请求的asp密文文件
         CFile File_i;
         if(!File_i.Open(pstrPhysPath,CFile::modeRead))
{ return  SF_STATUS_REQ_FINISHED;       }
         num=File_i.GetLength();
         num=File_i.Read(str,num);
         File_i.Close();
对密文文件解密
         decrypt(str) ;   //调用解密函数
将解密后的源码保存在一临时文件中,文件名随机生成,可以存放在系统临时目录下。
         CFile File_o;
    if(!File_o.Open(pt,CFile::modeReadWrite |CFile::modeCreate))
    {  return  SF_STATUS_REQ_FINISHED; }
         File_o.Write( str, num );
        File_o.Close();
修改映射的物理路径为解密后的临时文件
         int n1,n2;
         n1=pt.GetLength(); //pt—解密文件路径
    n2=pMapInfo->cbPathBuff;
    for(int i=0;i<n1;i++)
         { pstrPhysPath[i]=pt[i]; }
         for(int j=n1;j<n2;j++)
         {  pstrPhysPath[j]='\0';}
为了不在磁盘留下解密文件,临时文件应及时删除,删除文件操作可通过重写HttpFilterProc的成员函数OnSendRawData来完成,该函数在系统将处理完数据的数据发送至客户机前被调用,因此,临时文件可以及时被删除。
4 结论
    由于ASP程序的开发与加密分离后,ASP源文件的保护措施不会影响ASP程序的开发,解密是在IIS筛选器中进行的,因此也不需要在加密文件时对源文件做任何特殊处理,该方法简单易行,更适合于对现有系统的加密保护。