ISAPI篩選器介紹 收藏_第1頁
ISAPI篩選器介紹 收藏_第2頁
ISAPI篩選器介紹 收藏_第3頁
ISAPI篩選器介紹 收藏_第4頁
ISAPI篩選器介紹 收藏_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、ISAPI篩選器介紹收藏ISAPI (Internet Server Application Programming Interface)作為一種可用來替代 CGI 的方法,是由微軟和Process軟件公司聯(lián)合提出的Web服務(wù)器上的API標準。ISAPI與Web服務(wù) 器結(jié)合緊密,功能強大,能夠獲得大量的信息,因此利用ISAPI可以開發(fā)出靈活高效的Web服務(wù)器增強程序。由于ISAPI程序與Web服務(wù)器的關(guān)系,使得ISAPI接口在安全方面有一定的研究價值。本文主要討論ISAPI在IIS和VC+ 6.0中的實現(xiàn)。一、ISAPI接口和CGI接口的不同。ISAPI程序和CGI程序完成類似的功能,但是實現(xiàn)

2、方法不同。1、ISAPI程序以DLL形式被Web服務(wù)器加載到自己的進程空間中,因此和服務(wù)器共用同一 個地址空間,且在沒有客戶請求時可以將其從內(nèi)存中卸載;而對客戶端發(fā)來的每個對CGI程序的請 求則需要服務(wù)器為它單獨啟動一個進程,這需要耗費大量的時間和內(nèi)存。當并發(fā)的請求數(shù)目很大時, 使用CGI在效率上不如ISAPI。2、CGI程序通過環(huán)境塊和標準輸入輸出與Web服務(wù)器進行通信,而ISAPI程序與服務(wù)器結(jié) 合得更為緊密,與服務(wù)器共享同一個進程上下文,主要通過一個參數(shù)塊與服務(wù)器進行交互,可以從服 務(wù)器那里獲得關(guān)于當前HTTP連接的大量信息。ISAPI主要分為ISA和ISAPI Filter兩部分。IS

3、A方法相對而言要傳統(tǒng)一些,利用一些特殊 的鏈接,指向服務(wù)器的作業(yè),供程序開發(fā)人員設(shè)計一些擴展功能;而ISAPI過濾器則傾向于構(gòu)造服 務(wù)器直接調(diào)用的模塊,提供一種無縫鏈接部件用于監(jiān)測直接來自于服務(wù)器的HTTP請求。二、ISAISA(Internet Server Application)也可稱為ISAPI DLL,其功能和CGI程序的功能直接相對 應(yīng),使用方法和CGI也類似,由客戶端在URL中指定其名稱而激活。例如下面的請求將調(diào)用 服務(wù)器的虛擬可執(zhí)行目錄Scripts下的function.dlKISAPI DLL必須放在服務(wù)器的虛擬可執(zhí)行目錄下): HYPERLINK /Scripts/func

4、tion.dll /Scripts/function.dll?ISA和服務(wù)器之間的接口主要有兩個:GetExtentionVersion()和HttpExtentionProc()。任何 ISA都必須在其PE文件頭的引出表中定義這兩個引出函數(shù),以供Web服務(wù)器在適當?shù)臅r候 調(diào)用。1、當服務(wù)器剛加載ISA時,它會調(diào)用ISA提供的GetExtention%rsion()來獲得該ISA所需 要的服務(wù)器版本,并與自己的版本相比較,以保證版本兼容。函數(shù)原型如下:BOOL WINAPI GetExtentionVjrsion(HSE_VERSION_INFO *version); typedef stru

5、ct _HSE_VERSION_INFO DWORD dwExtensionVjrsion;/ 版本號CHAR lpszExtensionDescHSE_MAX_EXT_DLL_NAME_LEN; /關(guān)于 ISA 的描述字 符串 HSE_VERSION_INFO, *LPHSE_VERSION_INFO;2、ISA的真正入口是HttpExtentionProc(),它相當于普通C程序的main()函數(shù),在這個函 數(shù)中根據(jù)不同的客戶請求作不同的處理。服務(wù)器和HttpExtentionProc()之間是通過擴展控制塊( Extention Control Block)來進行通信的,即ECB中存放入

6、口參數(shù)和出口參數(shù),包括服務(wù)器 提供的幾個回調(diào)函數(shù)的入口地址。函數(shù)原型如下:DWORD HttpExtensionProc( EXTENSION_CONTROL_BLOCK *pECB );ECB的結(jié)構(gòu)定義如下(IN表示入口參數(shù),OUT表示出口參數(shù)):typedef struct _EXTENSION_CONTROL_BLOCKDWORDcbSize;/IN,本結(jié)構(gòu)的大小,只讀DWORDdwVersion/IN,版本號,高16位為主版本號,低16位為次版本號HCONNConnID;/IN,連接句柄,由服務(wù)器分配,ISA只能讀取該值DWORDdwHttpStatusCode;/OUT,當前完成的事

7、務(wù)狀態(tài)CHARlpszLogDataHSE_LOG_BUFFER_LEN; /OUT,需要寫入到日志文件中的內(nèi)容LPSTRlpszMethod;/IN,等價于 CGI 的環(huán)境變量 REQUEST_METHODLPSTRlpszQueryString;/IN,等價于環(huán)境變量QUERY_STRINGLPSTRlpszPathInfo;/IN,等價于環(huán)境變量PATH_INFOLPSTRlpszPathTranslated;/IN,等價于環(huán)境變量PATH_TRANSLATEDDWORDcbTotalBytes;/IN,等價于環(huán)境變量CONTENT_LENGTHDWORDcbAvailable;/IN,

8、緩沖區(qū)中的可用字節(jié)數(shù)LPBYTEIpbData;/IN,緩沖區(qū)指針,指向客戶端發(fā)來的數(shù)據(jù)LPSTR IpszContentType;/IN,等價于環(huán)境變量CONTENT_TYPE回調(diào)函數(shù),用于返回服務(wù)器的連接信息或特定的服務(wù)器詳細情況BOOL ( WINAPI * GetServerVriable )(HCONN hConn,LPSTRlpszViriableName,LPVOIDlpvBuffer,LPDWORD lpdwSize );BOOL ( WINAPI * WriteClient )/回調(diào)函數(shù),從客戶端的HTTP請求中讀取數(shù)據(jù)(HCONN ConnID,LPVOID Buffer,

9、LPDWORDlpdwBytes,DWORDdwReserved );BOOL ( WINAPI * ReadClient )/回調(diào)函數(shù),向客戶端發(fā)送數(shù)據(jù)( HCONNConnID,LPVOID lpvBuffer,LPDWORDlpdwSize );BOOL ( WINAPI * ServerSupportFunction ) /回調(diào)函數(shù),訪問服務(wù)器的一般和特定功能( HCONN hConn,DWORDdwHSERRequest,LPVOIDlpvBuffer,LPDWORDlpdwSize,LPDWORD lpdwDataType ); EXTENSION_CONTROL_BLOCK, *

10、LPEXTENSION_CONTROL_BLOCK;在上述ECB中,服務(wù)器不但提供了當前HTTP連接的句柄和一些變量,而且提供了 4個回 調(diào)函數(shù)給ISA調(diào)用,從而使ISA可以獲得更詳盡的信息。三、ISAPI FilterISAPI Filter位于服務(wù)器和客戶端之間,能夠?qū)Ψ?wù)器和客戶端之間的通信進行預(yù)處理和后 處理,比如對通信進行加密/解密、提供對客戶進行身份驗證的新方法、提供自定義的日志記錄 等,在CGI中沒有與ISAPI Filter直接相對應(yīng)的部分。ISAPI Filter 與服務(wù)器之間的接口有兩個:GetFilterVersion()和 HttpFilterProc()。任何ISAP

11、I Filter都必須引出這兩個函數(shù)以供服務(wù)器調(diào)用。1、在注冊表的如下鍵值中存放著所有ISAPI Filter的文件名,IIS服務(wù)器啟動時從該鍵值中 獲得Filter的文件名并加載它們。HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/FilterDL L2、然后服務(wù)器調(diào)用每個Filter提供的GetFilterVersion()函數(shù),獲得版本號以及該Filter希望 處理的事件,即ISAPI Filter通過引出GetFilterV?rsion()函數(shù)來告知服務(wù)器自己希望處理什 么類型的事件,因為ISA

12、PI Filter是通過事件來激活的,當滿足條件的事件到達時,服務(wù)器 就會調(diào)用Filter引出的主函數(shù)HttpFilterProc()對該事件進行處理。GetFilterVjrsion()的原型如下:BOOL WINAPI GetFilterVfersion(DWORD dwServerFilterVjrsion;/IN,服務(wù)器使用的版本規(guī)范DWORD dwFilterV&sion;/OUT,過濾器使用的版本規(guī)范CHARlpszFilterDescSF_MAX_FILTER_DESC_LEN+1; /OUT,對該過濾器的描述字符串DWORD dwFlags/OUT,事件和優(yōu)先級標志);事件和優(yōu)

13、先級標志dwFlasg的取值在MSDN中有詳細解釋,其中包括該Filter被調(diào)用的優(yōu)先 級,一般應(yīng)使用默認的低優(yōu)先級,否則可能會對系統(tǒng)的性能造成很大影響。3、HttpFilterProc()是ISAPI Filter主要的入口函數(shù),它根據(jù)當前的事件的不同作出不同的處 理。服務(wù)器通過如下的參數(shù)塊和Filter進行交互,這個參數(shù)塊的作用和ISA中的ECB類似。typedef struct _HTTP_FILTER_CONTEXT DWORDcbSize;/IN,本參數(shù)塊的大小DWORDRevision;/INPVOIDServerContext;/IN,由server使用本參數(shù)DWORDulRes

14、erved;/IN,由server使用本參數(shù)BOOLfIsSecurePort;/IN,事件是否發(fā)生在安全端口上PVOID文pFilterContext;/IN/OUT,F(xiàn) 次請求相關(guān)的上下回調(diào)函數(shù),取得關(guān)于服務(wù)器和本次連接的信息BOOL (WINAPI * GetServerVariable)( struct _HTTP_FILTER_CONTEXT * pfc, LPSTRlpszVriableName,LPVOIDlpvBuffer,LPDWORD lpdwSize );BOOL (WINAPI * AddResponseHeaders)( 標頭struct _HTTP_FILTER_C

15、ONTEXT * pfc, LPSTR lpszHeaders, DWORD dwReserved );BOOL (WINAPI * WriteClient) (端struct _HTTP_FILTER_CONTEXT * pfc, LPVOID Buffer, LPDWORDlpdwBytes,DWORDdwReserved);VOID * (WINAPI * AllocMem)( struct _HTTP_FILTER_CONTEXT * pfc, DWORDcbSize,DWORDdwReserved);回調(diào)函數(shù),給HTTP響應(yīng)添加一個回調(diào)函數(shù),將原始數(shù)據(jù)發(fā)送給客戶回調(diào)函數(shù),分配內(nèi)存。B

16、OOL (WINAPI * ServerSupportFunction) (/回調(diào)函數(shù),訪問服務(wù)器的一般和特定功能struct _HTTP_FILTER_CONTEXT * pfc, enum SF_REQ_TYPE sfReq, PVOIDpData,DWORDul1,DWORDul2); HTTP_FILTER_CONTEXT, *PHTTP_FILTER_CONTEXT;四、VC+ 6.0中對ISAPI的支持VC+ 6.0中定義了 5個相關(guān)的類以簡化ISAPI的編程工作:CHttpServer、CHttpServerContext、 CHttpFilter、CHttpFilterCont

17、ext、CHtmlStream,這 5 個類都沒有父類。其中 CHttpServer 和 CHttpServerContext 主要用來編寫 ISA,CHttpFilter 和 CHttpFilterContext 則用來編寫 ISAPIFilter,而CHtmlStream則用來操作內(nèi)存中的HTML文件,為其它的4個類提供服務(wù)。CHttpServer在每個ISA中只能有一個實例,一個CHttpServer可以對應(yīng)多個CHttpServerContext實例, 每個CHttpServerContext處理一個客戶請求,這樣可以處理并發(fā)的HTTP請求;CHttpFilter和 CHttpFilt

18、erContext之間的關(guān)系與此類似,在每個ISAPI Filter中只能有一個CHttpFilter實例 ,但是可以有多個CHttpFilterContext來處理并發(fā)的事件。CHttpServer和CHttpFilter是獨立 的類,它們可以共存于一個DLL中,也可以分別在不同的DLL中。一個ISA可以提供多個命令,每個命令對應(yīng)于CHttpServer (或其子類)的一個成員函數(shù), 客戶端可以在URL中指定命令名及其參數(shù)。在VC+ 6.0中是通過parse map來實現(xiàn)這種對應(yīng)的。Parse map類似 MFC中的 Windows消息分發(fā)機制,通過使用 VC提供的 DECLARE_PARS

19、E_MAP、BEGIN_PARSE_MAP、ON_PARSE_COMMAND、ON_PARSE_COMMAND_PARAMS、 DEFAULT_PARSE_COMMANDEND_PARSE_MAP等宏,可以實現(xiàn)對不同的命令的處理。每個CHttpServer中只能建立一個 parsemap,當客戶端給ISA發(fā)來命令的時候,parse map可以分析HTTP請求中的命令名及其參 數(shù),將該命令與相應(yīng)的成員函數(shù)關(guān)聯(lián)起來,即由該成員函數(shù)處理該命令。以 MSDN中的例子程序 pinball 為例,該例中有下面這樣一個表單: Attack from Mars Twilight Zone The Addams

20、 Family Cirqus V)ltaire I dont see it here當客戶端選中了上面的表單中的“ Attack from Mars ”這一項并點擊了 submit按鈕后,服務(wù) 器端最終將得到如下的URL串: HYPERLINK /pinball.dll2MfcI /pinball.dll2MfcI . tImage&Favorite=1在該URL串中,命令名是GetImage,參數(shù)Favorite的值是1,因此pinball.dll中的如下成員 函數(shù)將被調(diào)用以處理該請求,其中參數(shù)dwChoice對應(yīng)URL中的參數(shù)Favorite:void CPinballExtension:GetImage(CHttpServerContext* pCtxt, long dwChoice);而parse

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論