呂浩勇 王仕杰 張朝陽
摘 要:本文深入探討了用ISAPI Filter建立IIS“防火墻”的原理和方法,并給出了保護(hù)Access數(shù)據(jù)庫文件不被用戶下載的例子來說明具體的實(shí)現(xiàn)方法。
關(guān)鍵詞:ISAPI IIS 防火墻 SQL注入
中圖分類號(hào):TP393.08 文獻(xiàn)標(biāo)識(shí)碼:B 文章編號(hào):1673-8454(2009)03-0052-02
隨著Internet的飛速發(fā)展,安全問題變得日益重要,防火墻技術(shù)越來越受到人們的重視。而今,Microsoft?誖Windows?誖家族的Internet 信息服務(wù)(IIS)成為廣大中小企業(yè)的Web平臺(tái),它在Intranet、Internet或Extranet上提供了集成、可靠、可伸縮、可管理的 Web 服務(wù)器功能,同時(shí)可以執(zhí)行的多種腳本滿足用戶動(dòng)態(tài)內(nèi)容的交互。有很多網(wǎng)站的后臺(tái)管理是直接從網(wǎng)上下載的源代碼,若這些源代碼存在漏洞也不容易發(fā)現(xiàn),本文介紹了一種利用ISAPI(Internet Server Application Programming Interface,互聯(lián)網(wǎng)應(yīng)用程序編程接口)來建立IIS“防火墻”技術(shù),該技術(shù)具有安全、穩(wěn)定、易用等優(yōu)點(diǎn),且不需要修改原始的網(wǎng)站源代碼,能在網(wǎng)站源代碼存在漏洞的情況下防御攻擊,實(shí)現(xiàn)防火墻部分功能。
一、ISAPI Filter概述
ISAPI是由微軟和Process軟件公司聯(lián)合提出的Web服務(wù)器上的API標(biāo)準(zhǔn)。ISAPI被分為兩種類型:ISAPI Server Extension(ISAPI服務(wù)器擴(kuò)展)和ISAPI Filter(ISAPI過濾器)。其中,ISAPI Server Extension 可實(shí)現(xiàn)通常CGI 程序的功能,它利用一些特殊的鏈接,指向服務(wù)器的作業(yè),供程序開發(fā)人員設(shè)計(jì)一些擴(kuò)展功能;而ISAPI Filter 則可為IIS提供縱向擴(kuò)展的功能,它傾向于構(gòu)造服務(wù)器直接調(diào)用的模塊,提供一種無縫鏈接部件用于監(jiān)測來自于服務(wù)器的HTTP 請求。ISAPI Filter的應(yīng)用程序以動(dòng)態(tài)鏈接庫的形式參與Web服務(wù)器的運(yùn)作,它在Web Server 啟動(dòng)時(shí)被調(diào)用,在Web Server 停止時(shí)被卸載。ISAPI Filter 位于服務(wù)器和客戶端之間,能夠?qū)eb服務(wù)器和客戶端之間的通信進(jìn)行預(yù)處理(Pre-processing of requests)和后處理(Post-processing)。用戶對Web服務(wù)器的請求均會(huì)先通過ISAPI Filter進(jìn)行過濾,而Web服務(wù)器返回瀏覽器的響應(yīng)也會(huì)首先經(jīng)ISAPI Filter過濾,才能觸發(fā)IIS的響應(yīng)。ISAPI Filter能用來定制以下事件:處理HTTP協(xié)議頭預(yù)處理、接收發(fā)送數(shù)據(jù)的預(yù)處理、HTTP會(huì)話結(jié)束信息處理、自定義的安全認(rèn)證機(jī)制、數(shù)據(jù)壓縮、數(shù)據(jù)加密、URL映射信息處理、日志記錄處理等。由此可見,靈活利用這些定制處理,就可以完成許多看似難以實(shí)現(xiàn)的功能,如:統(tǒng)計(jì)文件訪問量、防SQL注入、防文件下載、限制IP地址訪問、會(huì)話結(jié)束等,可以實(shí)現(xiàn)許多依賴防火墻才能實(shí)現(xiàn)的功能,定制一個(gè)自己的IIS“防火墻”。
二、創(chuàng)建ISAPI Filter的方法
一個(gè)標(biāo)準(zhǔn)的ISAPI Filter由以下幾個(gè)部分組成:過濾器初始化、消息接收過濾、事件處理、退出處理。創(chuàng)建ISAPI Filter非常簡單,只需完成3個(gè)接口DLL函數(shù)即可。它們是GetFilterVersion( )和HttpFilterProc( )和TerminateFilter( )??梢圆榭碝icrosoft Developer Network(MSDN)了解詳細(xì)的幫助。ISAPI Filter是動(dòng)態(tài)鏈接庫(DLL)文件,可以采用多種編程語言開發(fā),如:VC++、VB或C/C++等語言開發(fā)。開發(fā)時(shí)可以直接使用API函數(shù),也可以使用Microsoft Foundation Classes(MFC,微軟基礎(chǔ)類庫)。前者生成的文件小,耗用系統(tǒng)資源小,開發(fā)時(shí)相對復(fù)雜一些,后者生成的文件較大,運(yùn)行時(shí)效率也不如前者,并且離不開MFC的支持,但開發(fā)時(shí)較為便利。因此常用的做法是在MFC下開發(fā),開發(fā)完后再移植為API。本文采用Windows C語言開發(fā)。IIS調(diào)用每個(gè)Filter提供的GetFilterVersion()函數(shù),獲得Filter所需要的服務(wù)器版本,并與自己的版本相比較,以保證版本兼容以及該Filter希望處理的事件類型。ISAPI Filter是通過事件來激活的,當(dāng)滿足條件的事件到達(dá)時(shí),服務(wù)器就會(huì)調(diào)用Filter引出的函數(shù)HttpFilterProc( )對該事件進(jìn)行處理,在這個(gè)函數(shù)中根據(jù)不同事件作不同處理,服務(wù)器和HttpFilterProc( )之間是通過過濾器上下文(Http Filter Context)來進(jìn)行通信的。IIS停止時(shí)調(diào)用TerminateFilter( ),通常在該函數(shù)中釋放程序所用資源。接下來通過例子說明具體操作過程。
三、示例如何用ISAPI Filter建立IIS“防火墻”
1.保護(hù)Access文件原理
通過對客戶端的請求判斷其訪問文件的擴(kuò)展名并進(jìn)行過濾,就可以實(shí)現(xiàn)保護(hù)Access數(shù)據(jù)庫文件不被用戶下載。
因?yàn)锳ccess數(shù)據(jù)庫文件的擴(kuò)展名為mdb,當(dāng)客戶端訪問擴(kuò)展名為mdb的文件時(shí),就拒絕其訪問,并給出警告信息。
(1)創(chuàng)建Win32 Dynamic-Link Library項(xiàng)目
(2)過濾器初始化
過濾器初始化一般是設(shè)置版本信息、優(yōu)先級(jí)、過濾事件,這些工作在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過濾器程序所關(guān)注的事件為邏輯URL映射成物理路徑事件。當(dāng)該事件發(fā)生時(shí),IIS會(huì)傳送一個(gè)NotificationType的變量給HttpFilterProc函數(shù),由該函數(shù)對該事件做出處理。
(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轉(zhuǎn)換為小寫
lenURL = strlen(urls);
szExtension=&urls[lenURL - 3];//得到訪問文件的擴(kuò)展名
if ( strcmp(szExtension, "mdb") == 0 )
//比較文件擴(kuò)展名是否為mdb
{
sprintf(buf,"擴(kuò)展名為mdb的文件不允許訪問,請與管理員聯(lián)系。");
ilen=strlen(buf);
(pfc->WriteClient)(pfc,buf,&ilen ,0);
//如果訪問的是mdb文件,向客戶端發(fā)出警告信息
return SF_STATUS_REQ_FINISHED;
//返回SF_STATUS_REQ_FINISHED表示會(huì)話結(jié)束
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
//返回SF_STATUS_REQ_NEXT_NOTIFICATION喚起下一個(gè)Filter響應(yīng)事件
}
2.在服務(wù)器上配置ISAPI Filter
為使ISAPI過濾器能夠運(yùn)行,對應(yīng)于不同版本的操作系統(tǒng)還需要采取不同措施:
(1)Windows NT:要在注冊表的如下鍵值中存放ISAPI Filter的文件名,IIS服務(wù)器啟動(dòng)時(shí)從該鍵值中獲得Filter的文件名并加載它們。
HKEY_LOCAL_MACHINESystemCurrentControlSetServicesW3SVCParameters FilterDlls鍵值為ISAPI過濾器文件的全路徑名稱,不同的ISAPI過濾器文件之間用“;”分隔,可以根據(jù)執(zhí)行的優(yōu)先順序加在適當(dāng)?shù)奈恢谩TO(shè)置好后重新啟動(dòng)IIS服務(wù),ISAPI過濾器就能發(fā)揮作用了。
(2)Windows 2000,Windows Server 2003:打開Internet信息服務(wù)管理器,關(guān)閉IIS服務(wù),在Web站點(diǎn)屬性頁上選中ISAPI篩選器標(biāo)簽,將Filter加入到列表框中,重新啟動(dòng)IIS服務(wù)即能使ISAPI過濾器生效了。
3.測試效果
在瀏覽器中輸入“Http://127.0.0.1/a.mdb”瀏覽器顯示如下信息:擴(kuò)展名為mdb的文件不允許訪問,請與管理員聯(lián)系;訪問服務(wù)器的其他文件,均正常。這就有效地保護(hù)了Web服務(wù)器上擴(kuò)展名為mdb的文件。
四、結(jié)束語
Web服務(wù)器安全是一個(gè)需要不斷認(rèn)識(shí)的過程。針對目前廣泛使用的IIS服務(wù)器,本文的方法有一定的實(shí)際意義,通過ISAPI Filter可以方便地完成許多強(qiáng)大的功能(如:統(tǒng)計(jì)文件訪問量、防SQL注入、防文件下載、限制IP地址訪問、結(jié)束會(huì)話等),使Web服務(wù)器的安全得到進(jìn)一步提高,同時(shí)使信息得到有效的處理。
參考文獻(xiàn):
[1]Charles Petzold.Windows程序設(shè)計(jì)(第五版)[M].北京:北京大學(xué)出版社,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)