寇曉蕤
(中國(guó)華藝廣播公司華廣網(wǎng),福建 福州350003)
互聯(lián)網(wǎng)為信息獲取和發(fā)布提供了無可比擬的便捷渠道,但在互聯(lián)網(wǎng)的使用過程中也存在各種各樣的負(fù)面問題,比如:互聯(lián)網(wǎng)上存在大量的色情信息、不良言論,機(jī)構(gòu)內(nèi)用戶可能在正常工作時(shí)間段內(nèi)瀏覽娛樂和電子購(gòu)物網(wǎng)站。針對(duì)上述情況,互聯(lián)網(wǎng)網(wǎng)頁信息過濾技術(shù)和系統(tǒng)已經(jīng)獲得了越來越廣泛的應(yīng)用。目前,該類系統(tǒng)主要有兩個(gè)方向:針對(duì)個(gè)人用戶的系統(tǒng)主要是用于未成年人保護(hù),實(shí)現(xiàn)色情信息過濾和上網(wǎng)時(shí)間限制,比如Net Nanny[1]等;針對(duì)機(jī)構(gòu)用戶的系統(tǒng)通常以用戶上網(wǎng)行為審計(jì)的形式實(shí)現(xiàn),通過在機(jī)構(gòu)網(wǎng)絡(luò)出入口處統(tǒng)一部署服務(wù)器以實(shí)現(xiàn)全網(wǎng)信息的監(jiān)控過濾,比如國(guó)內(nèi)知名的深信服系統(tǒng)。該類系統(tǒng)功能全面,費(fèi)用較高。本文基于瀏覽器輔助對(duì)象 (browser helper object,BHO)技術(shù),實(shí)現(xiàn)了一個(gè)輕便的網(wǎng)頁信息過濾系統(tǒng),可同時(shí)滿足上述兩種需求,能夠較為有效地實(shí)現(xiàn)不良信息封堵并定制需屏蔽的網(wǎng)站。
(1)概況
BHO[2-6]是針 對(duì)IE (internet explorer)瀏 覽 器 的 第 三方開放式交互接口標(biāo)準(zhǔn),通過這個(gè)接口,程序員可以編寫代碼以獲取瀏覽器的行為和事件,比如 “前進(jìn)”、“后退”、“刷新”等,也可以獲取瀏覽器菜單、工具欄等組件的信息,甚至控制瀏覽器的行為,比如修改替換工具欄等,基于BHO的一切行為都被視為合法 (微軟允許)。
(2)BHO插件形式
從實(shí)現(xiàn)的角度看[7,8],基于BHO的程序是一個(gè)動(dòng)態(tài)鏈接庫(kù) (dynamic link library,DLL),它以進(jìn)程內(nèi)組件對(duì)象模型 (component object model,COM)對(duì)象的形式存在,以便在與瀏覽器相同的上下文環(huán)境中運(yùn)行,并在每個(gè)瀏覽器啟動(dòng)時(shí)被加載。這樣,一旦打開一個(gè)新的瀏覽器窗口,一個(gè)新的BHO對(duì)象就會(huì)生成,并能夠?qū)捎玫哪K和窗口執(zhí)行任意操作。
IE瀏覽器加載和初始化BHO對(duì)象的原理如圖1所示,每個(gè)BHO對(duì)象都會(huì)將其功能以一個(gè)接口的形式實(shí)現(xiàn)以供瀏覽器調(diào)用,這個(gè)接口就是 “IUnknown”。此外,每個(gè)BHO對(duì)象都必須在系統(tǒng)注冊(cè)表中注冊(cè),以便實(shí)現(xiàn)在瀏覽器啟動(dòng)時(shí)自動(dòng)加載。每個(gè)BHO對(duì)象都有一個(gè)全球唯一的身份標(biāo)識(shí)號(hào)碼 (identity,ID),由系統(tǒng)根據(jù)時(shí)間、硬件配置等信息隨機(jī)生成。這個(gè)ID也被寫入注冊(cè)表中。
圖1 IE瀏覽器加載和初始化BHO對(duì)象原理
(3)BHO插件的技術(shù)實(shí)現(xiàn)
BHO插件通常需要實(shí)現(xiàn)兩個(gè)接口:“IObjectWithSite”和 “IDispatch”,前者用來獲取瀏覽器接口,后者則用來監(jiān)聽瀏覽器的事件。BHO定義了若干事件,比如,“DISPID_BEFORENAVIGATE2”,“DISPID_DOCUMENTCOMPLETE”等,前者在網(wǎng)頁超鏈接被點(diǎn)中時(shí)響應(yīng),后者在網(wǎng)頁超文本標(biāo)記語言 (hyper text markup language,HTML)源文件下載完成后響應(yīng)。BHO插件可以監(jiān)聽這些事件并選擇在適當(dāng)?shù)氖录l(fā)生時(shí)進(jìn)行相應(yīng)操作,比如需要定制瀏覽器的程序開發(fā)人員可以選擇在用戶加載IE瀏覽器應(yīng)用及瀏覽器主界面顯示前加入自己的組件,在 “DISPID_BEFORENAVIGATE2”時(shí)將用戶導(dǎo)向指定的超鏈接,而不是用戶實(shí)際要訪問的地址;在 “DISPID_DOCUMENTCOMPLETE”時(shí)替換頁面或在頁面源文件中插入代碼。事實(shí)上,當(dāng)一個(gè)網(wǎng)頁全部下載完成后,BHO插件可獲取一個(gè)動(dòng)態(tài)HTML (dynamic HTML,DHTML)文檔模型,通過該模型即可對(duì)下載的網(wǎng)頁進(jìn)行讀寫訪問,從而完成頁面替換、插入和腳本執(zhí)行等操作。以上這些為實(shí)現(xiàn)網(wǎng)頁過濾提供了便利。
(1)BHO插件注冊(cè)問題
BHO插件最終形式為一個(gè)DLL。如前所述,每當(dāng)IE瀏覽器啟動(dòng)時(shí),BHO插件會(huì)被動(dòng)態(tài)加載,這個(gè)特性實(shí)現(xiàn)的前提是BHO插件在注冊(cè)表中注冊(cè)。
當(dāng)使用VC作為開發(fā)環(huán)境時(shí),需使用活動(dòng)模板庫(kù) (active template library,ATL)開 發(fā)[9,10]。 當(dāng) 插 入 一 個(gè) 新 的ATL對(duì)象時(shí) (假設(shè)名稱為 “a”)會(huì)自動(dòng)生成一個(gè)含有注冊(cè)信息的 “a.rgs”,文件,內(nèi)容的默認(rèn)形式如下:
其中CLSID為默認(rèn)生成的BHO對(duì)象全球唯一對(duì)象ID。
為了進(jìn)行注冊(cè),需要對(duì)上述文件作兩項(xiàng)修改:將 “%MODULE%”替換為BHO組件DLL對(duì)應(yīng)的路徑和文件名,并在上述文件內(nèi)容后添加以下信息:
當(dāng)構(gòu)建好該文件后,執(zhí)行 “regsvr32”命令即可實(shí)現(xiàn)BHO組件注冊(cè)。
(2)用戶瀏覽行為的監(jiān)控問題
用戶瀏覽行為監(jiān)控是整個(gè)系統(tǒng)的核心功能,為了實(shí)現(xiàn)監(jiān)控目標(biāo),應(yīng)能夠在用戶訪問不良網(wǎng)址前就對(duì)這個(gè)網(wǎng)址進(jìn)行屏蔽,在用戶所瀏覽頁面已經(jīng)下載完畢,但呈現(xiàn)給用戶之前就能夠?qū)ζ渲械牟涣夹畔⒁皂撁嫣鎿Q、腳本執(zhí)行等形式進(jìn)行處理和告警。為實(shí)現(xiàn)上述功能,首先需要捕獲瀏覽器的部分事件并進(jìn)行相應(yīng)操作。進(jìn)行ATL開發(fā)并插入 “IE ATL對(duì)象”后,系統(tǒng)會(huì)默認(rèn)生成 “Invoke”函數(shù),提供瀏覽器事件捕獲的接口。
事件1:捕獲 “DISPID_BEFORENAVIGATE2”事件,并記錄用戶瀏覽網(wǎng)址。若網(wǎng)址包含在非法網(wǎng)站網(wǎng)址列表中,則直接屏蔽該網(wǎng)站。
事件2:捕獲 “DISPID_DOCUMENTCOMPLETE”事件,并獲取用戶瀏覽器所獲取的HTML源文件以及當(dāng)前瀏覽器窗口對(duì)象,為頁面過濾、替換、告警等提供支撐。若源文件中包含敏感詞,則直接進(jìn)行過濾操作。
網(wǎng)站屏蔽和網(wǎng)頁過濾使用頁面替換及腳本執(zhí)行的方式實(shí)現(xiàn),具體處理方式如下:
網(wǎng)站屏蔽:將用戶瀏覽的頁面替換為空白頁或警告頁,同時(shí)使用腳本執(zhí)行的方式彈出告警信息。
網(wǎng)頁過濾:將用戶瀏覽的頁面替換為指定頁面或?qū)⒚舾性~剔除后返回給用戶,同時(shí)使用腳本執(zhí)行的方式彈出告警信息。
以上過程中涉及的幾個(gè)關(guān)鍵操作如下:
操作1 在 “Invoke”函數(shù)中取參數(shù) “pDispParams”相關(guān)字段獲取用戶瀏覽網(wǎng)址;
操作2 使用 “get_Document”函數(shù)獲取HTML源文件;
操作3 使用 “get_parentWindow”函數(shù)獲取用戶瀏覽器窗口對(duì)象指針;
操作4 使用 “put_innerHTML”函數(shù)實(shí)現(xiàn)頁面替換;
操作5 使用 “execScript”函數(shù)實(shí)現(xiàn)腳本執(zhí)行,該操作需依托用戶瀏覽器窗口對(duì)象實(shí)現(xiàn)。
(1)系統(tǒng)設(shè)計(jì)架構(gòu)
針對(duì)網(wǎng)頁過濾的應(yīng)用需求,系統(tǒng)應(yīng)實(shí)現(xiàn)以下功能:
1) 對(duì)于指定網(wǎng)站的過濾;
2)對(duì)于包含不良信息的網(wǎng)頁的過濾,包含網(wǎng)頁不良內(nèi)容的屏蔽替換功能和全網(wǎng)頁屏蔽功能;
3)對(duì)于全網(wǎng)用戶違規(guī)網(wǎng)站和不良網(wǎng)頁訪問行為的監(jiān)控;
4)對(duì)用戶違規(guī)訪問行為的告警和記錄。
為實(shí)現(xiàn)上述功能,系統(tǒng)設(shè)計(jì)架構(gòu)見圖2。整個(gè)系統(tǒng)使用C/S模式,包含監(jiān)控服務(wù)器和客戶端兩個(gè)部分,其中客戶端安裝于受監(jiān)控的客戶端主機(jī)上,實(shí)現(xiàn)對(duì)宿主機(jī)用戶Web瀏覽行為的監(jiān)控;服務(wù)器則安裝于網(wǎng)內(nèi)專用服務(wù)器上,以實(shí)現(xiàn)全網(wǎng)用戶行為的監(jiān)控。
從數(shù)據(jù)交互的角度看,管理員負(fù)責(zé)配置網(wǎng)址庫(kù)和敏感詞庫(kù)的內(nèi)容,這些內(nèi)容通過服務(wù)器的過濾信息更新模塊傳遞給客戶端的相應(yīng)模塊并寫入客戶端本地網(wǎng)址庫(kù)和敏感詞庫(kù)。此外,當(dāng)對(duì)不良頁面實(shí)施頁面替換、腳本執(zhí)行等操作時(shí),需要替換后的頁面源文件和腳本文件,這些信息也通過過濾更新模塊由服務(wù)器傳遞給客戶端并寫入客戶端本地文件系統(tǒng)。頁面過濾模塊以本地的網(wǎng)址庫(kù)和敏感詞庫(kù)為依據(jù),對(duì)不良網(wǎng)站和頁面進(jìn)行過濾。對(duì)于需要進(jìn)行頁面替換的,則從本地文件系統(tǒng)中讀取相應(yīng)文件進(jìn)行頁面替換;對(duì)需要進(jìn)行提示警告的,從本地文件系統(tǒng)取腳本文件執(zhí)行??蛻舳吮镜氐谋O(jiān)控結(jié)果通過狀態(tài)監(jiān)控模塊定期返回給服務(wù)器,寫入服務(wù)器結(jié)果庫(kù)并呈現(xiàn)給管理員用戶。
客戶端包含3個(gè)底層數(shù)據(jù)庫(kù)和3個(gè)功能模塊,其中網(wǎng)址庫(kù)、敏感詞庫(kù)和本地結(jié)果庫(kù)分別存放了需要過濾的網(wǎng)址、敏感詞,以及本地用戶不良Web瀏覽行為的監(jiān)控結(jié)果。網(wǎng)頁過濾模塊包含網(wǎng)址過濾、頁面內(nèi)容檢查、頁面替換和腳本執(zhí)行等子模塊,分別實(shí)現(xiàn)對(duì)指定網(wǎng)址的過濾、對(duì)宿主機(jī)用戶所瀏覽的頁面進(jìn)行內(nèi)容檢查、對(duì)頁面內(nèi)不良的內(nèi)容進(jìn)行替換以及針對(duì)用戶訪問不良頁面的行為用腳本執(zhí)行的方式進(jìn)行提示警告的功能。過濾信息更新模塊負(fù)責(zé)對(duì)網(wǎng)址庫(kù)和敏感詞庫(kù)的內(nèi)容進(jìn)行更新。狀態(tài)監(jiān)控模塊負(fù)責(zé)本地系統(tǒng)的運(yùn)行狀態(tài)監(jiān)控,并將本地監(jiān)控結(jié)果上報(bào)給服務(wù)器。
圖2 系統(tǒng)結(jié)構(gòu)
服務(wù)器也包含3個(gè)底層數(shù)據(jù)庫(kù)和3個(gè)功能模塊,其中網(wǎng)址庫(kù)、敏感詞庫(kù)和本地結(jié)果庫(kù)分別存放了需要過濾的網(wǎng)址、敏感詞,以及所有客戶端用戶不良Web瀏覽行為的監(jiān)控結(jié)果。過濾信息更新模塊負(fù)責(zé)將網(wǎng)址庫(kù)和敏感詞庫(kù)的內(nèi)容向各個(gè)客戶端進(jìn)行更新。狀態(tài)監(jiān)控模塊負(fù)責(zé)所有客戶端的運(yùn)行狀態(tài)監(jiān)控,并負(fù)責(zé)接收所有客戶端的監(jiān)測(cè)結(jié)果。管理員接口模塊與用戶直接交互,接收管理員的配置信息并向其返回結(jié)果。
(2)改進(jìn)策略
改進(jìn)1 捎帶的客戶端主機(jī)心跳信號(hào)發(fā)送機(jī)制。
對(duì)于服務(wù)器而言,需要監(jiān)控每個(gè)客戶端的運(yùn)行狀態(tài)。為實(shí)現(xiàn)這一功能,在設(shè)計(jì)時(shí)引入 “心跳”機(jī)制,即客戶端定期向服務(wù)器發(fā)送 “心跳”信號(hào)以向服務(wù)器證明自己處于開機(jī)、在線及正常運(yùn)行狀態(tài),相應(yīng)的服務(wù)器則定期檢測(cè)每個(gè)客戶端的心跳信號(hào)發(fā)送情況,以此協(xié)作實(shí)現(xiàn)狀態(tài)監(jiān)控目的。此外,客戶端還要向服務(wù)器定期報(bào)告宿主機(jī)頁面瀏覽的監(jiān)控結(jié)果。綜合考慮上述兩個(gè)因素,為提高系統(tǒng)運(yùn)行效率,在心跳信號(hào)發(fā)送方面采用以下策略:
策略1 心跳信號(hào)內(nèi)容為宿主機(jī)頁面瀏覽監(jiān)控結(jié)果;
策略2 客戶端初始啟動(dòng)時(shí)向服務(wù)器發(fā)送登錄信號(hào),格式同宿主機(jī)頁面瀏覽監(jiān)控結(jié)果,內(nèi)容為空;
策略3 客戶端啟動(dòng)后,每隔Th時(shí)間段向服務(wù)器發(fā)送“心跳”信號(hào),若到期無頁面瀏覽監(jiān)控結(jié)果,則內(nèi)容為空;
策略4 服務(wù)器保存一個(gè)客戶端狀態(tài)表,存放心跳信息及最近一次 “心跳”信號(hào)接收時(shí)間;
策略5 服務(wù)器設(shè)置定期檢測(cè)狀態(tài)表,時(shí)間間隔為Th,查看每個(gè)客戶端最后一次 “心跳”信號(hào)接收時(shí)間距離當(dāng)前時(shí)間的間隔Tl;
策略6 若Tl>=3* Th,則向客戶端發(fā)送狀態(tài)查詢信號(hào);
策略7 客戶端若收到服務(wù)器的狀態(tài)查詢信號(hào),則返回3倍Th時(shí)間段內(nèi)的狀態(tài)信息;
策略8 若服務(wù)器未收到客戶端返回的狀態(tài)查詢信號(hào),則認(rèn)為客戶端下線。
Tl設(shè)置為Th3倍的原因在于防止心跳信號(hào)丟失造成的誤判,策略7配合該策略使用,以防止頁面瀏覽監(jiān)控結(jié)果的丟失。
改進(jìn)2 模塊化實(shí)現(xiàn)以提高系統(tǒng)適用性。
如前所述,系統(tǒng)需滿足兩類需求,即個(gè)人用戶和機(jī)構(gòu)用戶。上述C/S模式適用于機(jī)構(gòu)用戶??紤]到個(gè)人用戶的需求,系統(tǒng)采用模塊化設(shè)計(jì)。用于個(gè)人用戶時(shí),狀態(tài)監(jiān)控模塊不安裝。此外,系統(tǒng)發(fā)布站點(diǎn)后臺(tái)設(shè)置過濾信息更新模塊,與客戶端的相應(yīng)模塊進(jìn)行通信以便進(jìn)行過濾網(wǎng)址和關(guān)鍵詞等信息的更新。
基于上述設(shè)計(jì),整個(gè)系統(tǒng)最終實(shí)現(xiàn)見圖3。其中服務(wù)器組件包括一個(gè)用戶接口 (user interface),兩個(gè)功能線程,一個(gè)定時(shí)器,一個(gè)隊(duì)列和一個(gè)數(shù)據(jù)庫(kù)?!癈lient State”隊(duì)列中包含了客戶端狀態(tài)報(bào)告信息,數(shù)據(jù)庫(kù)中設(shè)置不同的表,分別存放監(jiān)控結(jié)果、敏感詞和需過濾網(wǎng)址。狀態(tài)監(jiān)控線程(state thread)實(shí)現(xiàn)兩個(gè)功能,一是開啟網(wǎng)絡(luò)端口,接收客戶端報(bào)告信息;二是通過定時(shí)器控制定期檢測(cè) “Client State”隊(duì)列中各個(gè)客戶端的報(bào)告信息。過濾信息更新線程(state update)實(shí)現(xiàn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)更新。
圖3 系統(tǒng)實(shí)現(xiàn)組件組成
客戶端組件包括一個(gè)定時(shí)器,兩個(gè)功能線程,一個(gè)DLL和一個(gè)數(shù)據(jù)庫(kù)。其中數(shù)據(jù)庫(kù)中包含不同的表,分別存放監(jiān)控結(jié)果、敏感詞和需過濾網(wǎng)址。狀態(tài)監(jiān)控線程 (state thread)通過定時(shí)器控制,開啟網(wǎng)絡(luò)端口,向服務(wù)器定時(shí)報(bào)告信息并接受服務(wù)器的查詢信息。過濾信息更新線程(state update)開啟網(wǎng)絡(luò)端口,從服務(wù)器接收更新數(shù)據(jù)。“WebPage.dll”是整個(gè)系統(tǒng)的核心組件,基于BHO實(shí)現(xiàn)用戶網(wǎng)頁瀏覽行為的監(jiān)控。這個(gè)DLL的功能隨著IE瀏覽器的啟動(dòng)而加載。
系統(tǒng)使用VC6.0平臺(tái)開發(fā),開發(fā)語言為C++,數(shù)據(jù)庫(kù)管理系統(tǒng)采用SQL Server 2005,網(wǎng)絡(luò)通信部分使用Win-Sock2,最終的協(xié)同界面如圖4所示。
圖4 系統(tǒng)界面
本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于BHO劫持技術(shù)的網(wǎng)頁信息過濾系統(tǒng)。由于使用了微軟 “合法”的BHO插件技術(shù)并采用了恰當(dāng)?shù)哪K化設(shè)計(jì)方案,相對(duì)針對(duì)個(gè)人用戶的過濾系統(tǒng)和針對(duì)機(jī)構(gòu)用戶的上網(wǎng)行為審計(jì)設(shè)備而言,本文的系統(tǒng)能夠以較小的代價(jià)和靈活的部署方式同時(shí)滿足上述兩種環(huán)境下的網(wǎng)站屏蔽和網(wǎng)頁過濾的應(yīng)用需求,具有良好的實(shí)用性和通用性。
:
[1]Net Nanny.Net Nanny net filter[EB/OL].[2012-10-12].http://www.netnanny.com/.
[2]Baidu.BHO[EB/OL].[2012-08-31].http://baike.baidu.com/view/362533.htm (in Chinese).[百 度 文 庫(kù).BHO [EB/OL].[2012-08-31.]http://baike.baidu.com/view/362533.htm.]
[3]FENG Xueping,LI Zhitang,XU Hao,et al.A method of malicious webpages behavior detection based on BHO technology[J].Journal of Guangxi University (Natural Science Edition),2011,36 (z1):122-126 (in Chinese).[馮雪坪,李芝棠,涂浩,等.基于BHO技術(shù)的惡意網(wǎng)頁行為檢測(cè)方法 [J].廣西大學(xué)學(xué)報(bào) (自然科學(xué)版),2011,36 (z1):122-126.]
[4]SANG Qingbing,WU Xiaojun.Research and implementation of BHO-based website filtering system [J].Computer Engineering and Applications,2009,45 (31):18-21 (in Chinese). [桑慶兵,吳小俊.基于BHO的網(wǎng)站過濾系統(tǒng)研究與實(shí)現(xiàn) [J].計(jì)算機(jī)工程與應(yīng)用,2009,45 (31):18-21.]
[5]JIANG Liya,HUO Hongtao.Filter of erotic images based on IE [J].Application Research of Computers,2009,26 (3):1180-1183 (in Chinese).[蔣麗亞,霍宏濤.基于IE瀏覽器的色情圖像過濾器 [J].計(jì)算機(jī)應(yīng)用研究,2009,26 (3):1180-1183.]
[6]WANG Juan,GUO Yongchong,WANG Qiang.Research of network covert channel based on BHO [J].Computer Engineering,2009,35 (5):159-161 (in Chinese). [王娟,郭永沖,王強(qiáng).基于BHO的網(wǎng)絡(luò)隱蔽通道研究 [J].計(jì)算機(jī)工程,2009,35 (5):159-161.]
[7]Vckbase.How to have your Internet Explorer custom-made with BHO [EB/OL].[2012-10-12].http://www.vckbase.com/index.php/Old/index/id/1426 (in Chinese).[VC 知 識(shí)庫(kù).如何使用BHO定制你的Internet Explorer瀏覽器 [EB/OL]. [2012-10-12].http://www.vckbase.com/index.php/Old/index/id/1426.]
[8]LU Qiming.Developing BHO plug-ins with VC++——having your explorer custom-made [EB/OL]. [2012-10-12].http://www.cnblogs.com/hbifts/articles/24265.html (in Chinese).[陸其明.VC++開發(fā)BHO插件——定制你的瀏覽器 [EB/OL].[2012-10-12].http://www.cnblogs.com/hbifts/articles/24265.html.]
[9]WANG Zhifei.Analysis of ATL intelligent pointers CComPtr and CComQIPtr [J].Journal of Liaoning Teachers College,2009,11 (4):37-39 (in Chinese). [王志飛.ATL智能指針類CComPtr與CComQIPtr解析 [J].遼寧師專學(xué)報(bào),2009,11(4):37-39.]
[10]Christopher Tavares,Kirk Fertitta,Brent E Rector.ATL internals:Working with ATL 8 [M].2nd ed.Boston,Massachusetts,USA:Addison Wesley Professional,2006:137-159.