吕浩勇 王仕杰 张朝阳
摘 要:本文深入探讨了用ISAPI Filter建立IIS“防火墙”的原理和方法,并给出了保护Access数据库文件不被用户下载的例子来说明具体的实现方法。
关键词:ISAPI IIS 防火墙 SQL注入
中图分类号:TP393.08 文献标识码:B 文章编号:1673-8454(2009)03-0052-02
随着Internet的飞速发展,安全问题变得日益重要,防火墙技术越来越受到人们的重视。而今,Microsoft?誖Windows?誖家族的Internet 信息服务(IIS)成为广大中小企业的Web平台,它在Intranet、Internet或Extranet上提供了集成、可靠、可伸缩、可管理的 Web 服务器功能,同时可以执行的多种脚本满足用户动态内容的交互。有很多网站的后台管理是直接从网上下载的源代码,若这些源代码存在漏洞也不容易发现,本文介绍了一种利用ISAPI(Internet Server Application Programming Interface,互联网应用程序编程接口)来建立IIS“防火墙”技术,该技术具有安全、稳定、易用等优点,且不需要修改原始的网站源代码,能在网站源代码存在漏洞的情况下防御攻击,实现防火墙部分功能。
一、ISAPI Filter概述
ISAPI是由微软和Process软件公司联合提出的Web服务器上的API标准。ISAPI被分为两种类型:ISAPI Server Extension(ISAPI服务器扩展)和ISAPI Filter(ISAPI过滤器)。其中,ISAPI Server Extension 可实现通常CGI 程序的功能,它利用一些特殊的链接,指向服务器的作业,供程序开发人员设计一些扩展功能;而ISAPI Filter 则可为IIS提供纵向扩展的功能,它倾向于构造服务器直接调用的模块,提供一种无缝链接部件用于监测来自于服务器的HTTP 请求。ISAPI Filter的应用程序以动态链接库的形式参与Web服务器的运作,它在Web Server 启动时被调用,在Web Server 停止时被卸载。ISAPI Filter 位于服务器和客户端之间,能够对Web服务器和客户端之间的通信进行预处理(Pre-processing of requests)和后处理(Post-processing)。用户对Web服务器的请求均会先通过ISAPI Filter进行过滤,而Web服务器返回浏览器的响应也会首先经ISAPI Filter过滤,才能触发IIS的响应。ISAPI Filter能用来定制以下事件:处理HTTP协议头预处理、接收发送数据的预处理、HTTP会话结束信息处理、自定义的安全认证机制、数据压缩、数据加密、URL映射信息处理、日志记录处理等。由此可见,灵活利用这些定制处理,就可以完成许多看似难以实现的功能,如:统计文件访问量、防SQL注入、防文件下载、限制IP地址访问、会话结束等,可以实现许多依赖防火墙才能实现的功能,定制一个自己的IIS“防火墙”。
二、创建ISAPI Filter的方法
一个标准的ISAPI Filter由以下几个部分组成:过滤器初始化、消息接收过滤、事件处理、退出处理。创建ISAPI Filter非常简单,只需完成3个接口DLL函数即可。它们是GetFilterVersion( )和HttpFilterProc( )和TerminateFilter( )。可以查看Microsoft Developer Network(MSDN)了解详细的帮助。ISAPI Filter是动态链接库(DLL)文件,可以采用多种编程语言开发,如:VC++、VB或C/C++等语言开发。开发时可以直接使用API函数,也可以使用Microsoft Foundation Classes(MFC,微软基础类库)。前者生成的文件小,耗用系统资源小,开发时相对复杂一些,后者生成的文件较大,运行时效率也不如前者,并且离不开MFC的支持,但开发时较为便利。因此常用的做法是在MFC下开发,开发完后再移植为API。本文采用Windows C语言开发。IIS调用每个Filter提供的GetFilterVersion()函数,获得Filter所需要的服务器版本,并与自己的版本相比较,以保证版本兼容以及该Filter希望处理的事件类型。ISAPI Filter是通过事件来激活的,当满足条件的事件到达时,服务器就会调用Filter引出的函数HttpFilterProc( )对该事件进行处理,在这个函数中根据不同事件作不同处理,服务器和HttpFilterProc( )之间是通过过滤器上下文(Http Filter Context)来进行通信的。IIS停止时调用TerminateFilter( ),通常在该函数中释放程序所用资源。接下来通过例子说明具体操作过程。
三、示例如何用ISAPI Filter建立IIS“防火墙”
1.保护Access文件原理
通过对客户端的请求判断其访问文件的扩展名并进行过滤,就可以实现保护Access数据库文件不被用户下载。
因为Access数据库文件的扩展名为mdb,当客户端访问扩展名为mdb的文件时,就拒绝其访问,并给出警告信息。
(1)创建Win32 Dynamic-Link Library项目
(2)过滤器初始化
过滤器初始化一般是设置版本信息、优先级、过滤事件,这些工作在GetFilterVersion()中完成,如:
BOOL WINAPI GetFilterVersion(PHTTP_FILTER_ VERSION pVer)
{
pVer->dwFilterVersion = HTTP_FILTER_REVISION;
lstrcpy(pVer->lpszFilterDesc,"Filter mdb");
pVer->dwFlags = SF_NOTIFY_URL_MAP;
return TRUE;
}
上面这段程序中“pVer->dwFlags=SF_NOTIFY_URL_ MAP;”表示ISAPI过滤器程序所关注的事件为逻辑URL映射成物理路径事件。当该事件发生时,IIS会传送一个NotificationType的变量给HttpFilterProc函数,由该函数对该事件做出处理。
(3)事件处理
DWORD WINAPI HttpFilterProc(HTTP_FILTER_ CONTEXT *pfc,DWORD noteType,VOID *pvNote)
{
char urls[256];
char buf[255];
DWORD lenURL;
char *szExtension;
intilen;
strcpy(urls,((PHTTP_FILTER_URL_MAP)pvNote)->pszURL);
//得到客户端访问的URL,保存在urls中
_strlwr(urls);//将urls转换为小写
lenURL = strlen(urls);
szExtension=&urls[lenURL - 3];//得到访问文件的扩展名
if ( strcmp(szExtension, "mdb") == 0 )
//比较文件扩展名是否为mdb
{
sprintf(buf,"扩展名为mdb的文件不允许访问,请与管理员联系。");
ilen=strlen(buf);
(pfc->WriteClient)(pfc,buf,&ilen ,0);
//如果访问的是mdb文件,向客户端发出警告信息
return SF_STATUS_REQ_FINISHED;
//返回SF_STATUS_REQ_FINISHED表示会话结束
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
//返回SF_STATUS_REQ_NEXT_NOTIFICATION唤起下一个Filter响应事件
}
2.在服务器上配置ISAPI Filter
为使ISAPI过滤器能够运行,对应于不同版本的操作系统还需要采取不同措施:
(1)Windows NT:要在注册表的如下键值中存放ISAPI Filter的文件名,IIS服务器启动时从该键值中获得Filter的文件名并加载它们。
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesW3SVCParameters FilterDlls键值为ISAPI过滤器文件的全路径名称,不同的ISAPI过滤器文件之间用“;”分隔,可以根据执行的优先顺序加在适当的位置。设置好后重新启动IIS服务,ISAPI过滤器就能发挥作用了。
(2)Windows 2000,Windows Server 2003:打开Internet信息服务管理器,关闭IIS服务,在Web站点属性页上选中ISAPI筛选器标签,将Filter加入到列表框中,重新启动IIS服务即能使ISAPI过滤器生效了。
3.测试效果
在浏览器中输入“Http://127.0.0.1/a.mdb”浏览器显示如下信息:扩展名为mdb的文件不允许访问,请与管理员联系;访问服务器的其他文件,均正常。这就有效地保护了Web服务器上扩展名为mdb的文件。
四、结束语
Web服务器安全是一个需要不断认识的过程。针对目前广泛使用的IIS服务器,本文的方法有一定的实际意义,通过ISAPI Filter可以方便地完成许多强大的功能(如:统计文件访问量、防SQL注入、防文件下载、限制IP地址访问、结束会话等),使Web服务器的安全得到进一步提高,同时使信息得到有效的处理。
参考文献:
[1]Charles Petzold.Windows程序设计(第五版)[M].北京:北京大学出版社,2001:1162-1175.
[2]George Shepherd.THE ASP COLUMN[J].MSDN Magazine, 1528-4859, 2004 Vol.19 No.2
[3]Panos Kougiouris. Intercept, Monitor, and Modify Web Requests with HTTP Filters in ISAPI and ASP.NET[J]. MSDN Magazine, 1528-4859, 2002 Vol.17 No.8
[4] JAY FRAZIER.IIS & ISAPI[J].Web techniques, 1999 Vol.4 No.8
[5] Microsoft Developer Network 2005(MSDN)