寇曉蕤
(中國華藝廣播公司華廣網,福建 福州350003)
互聯網為信息獲取和發布提供了無可比擬的便捷渠道,但在互聯網的使用過程中也存在各種各樣的負面問題,比如:互聯網上存在大量的色情信息、不良言論,機構內用戶可能在正常工作時間段內瀏覽娛樂和電子購物網站。針對上述情況,互聯網網頁信息過濾技術和系統已經獲得了越來越廣泛的應用。目前,該類系統主要有兩個方向:針對個人用戶的系統主要是用于未成年人保護,實現色情信息過濾和上網時間限制,比如Net Nanny[1]等;針對機構用戶的系統通常以用戶上網行為審計的形式實現,通過在機構網絡出入口處統一部署服務器以實現全網信息的監控過濾,比如國內知名的深信服系統。該類系統功能全面,費用較高。本文基于瀏覽器輔助對象 (browser helper object,BHO)技術,實現了一個輕便的網頁信息過濾系統,可同時滿足上述兩種需求,能夠較為有效地實現不良信息封堵并定制需屏蔽的網站。
(1)概況
BHO[2-6]是針 對IE (internet explorer)瀏 覽 器 的 第 三方開放式交互接口標準,通過這個接口,程序員可以編寫代碼以獲取瀏覽器的行為和事件,比如 “前進”、“后退”、“刷新”等,也可以獲取瀏覽器菜單、工具欄等組件的信息,甚至控制瀏覽器的行為,比如修改替換工具欄等,基于BHO的一切行為都被視為合法 (微軟允許)。
(2)BHO插件形式
從實現的角度看[7,8],基于BHO的程序是一個動態鏈接庫 (dynamic link library,DLL),它以進程內組件對象模型 (component object model,COM)對象的形式存在,以便在與瀏覽器相同的上下文環境中運行,并在每個瀏覽器啟動時被加載。這樣,一旦打開一個新的瀏覽器窗口,一個新的BHO對象就會生成,并能夠對可用的模塊和窗口執行任意操作。
IE瀏覽器加載和初始化BHO對象的原理如圖1所示,每個BHO對象都會將其功能以一個接口的形式實現以供瀏覽器調用,這個接口就是 “IUnknown”。此外,每個BHO對象都必須在系統注冊表中注冊,以便實現在瀏覽器啟動時自動加載。每個BHO對象都有一個全球唯一的身份標識號碼 (identity,ID),由系統根據時間、硬件配置等信息隨機生成。這個ID也被寫入注冊表中。

圖1 IE瀏覽器加載和初始化BHO對象原理
(3)BHO插件的技術實現
BHO插件通常需要實現兩個接口:“IObjectWithSite”和 “IDispatch”,前者用來獲取瀏覽器接口,后者則用來監聽瀏覽器的事件。BHO定義了若干事件,比如,“DISPID_BEFORENAVIGATE2”,“DISPID_DOCUMENTCOMPLETE”等,前者在網頁超鏈接被點中時響應,后者在網頁超文本標記語言 (hyper text markup language,HTML)源文件下載完成后響應。BHO插件可以監聽這些事件并選擇在適當的事件發生時進行相應操作,比如需要定制瀏覽器的程序開發人員可以選擇在用戶加載IE瀏覽器應用及瀏覽器主界面顯示前加入自己的組件,在 “DISPID_BEFORENAVIGATE2”時將用戶導向指定的超鏈接,而不是用戶實際要訪問的地址;在 “DISPID_DOCUMENTCOMPLETE”時替換頁面或在頁面源文件中插入代碼。事實上,當一個網頁全部下載完成后,BHO插件可獲取一個動態HTML (dynamic HTML,DHTML)文檔模型,通過該模型即可對下載的網頁進行讀寫訪問,從而完成頁面替換、插入和腳本執行等操作。以上這些為實現網頁過濾提供了便利。
(1)BHO插件注冊問題
BHO插件最終形式為一個DLL。如前所述,每當IE瀏覽器啟動時,BHO插件會被動態加載,這個特性實現的前提是BHO插件在注冊表中注冊。
當使用VC作為開發環境時,需使用活動模板庫 (active template library,ATL)開 發[9,10]。 當 插 入 一 個 新 的ATL對象時 (假設名稱為 “a”)會自動生成一個含有注冊信息的 “a.rgs”,文件,內容的默認形式如下:

其中CLSID為默認生成的BHO對象全球唯一對象ID。
為了進行注冊,需要對上述文件作兩項修改:將 “%MODULE%”替換為BHO組件DLL對應的路徑和文件名,并在上述文件內容后添加以下信息:

當構建好該文件后,執行 “regsvr32”命令即可實現BHO組件注冊。
(2)用戶瀏覽行為的監控問題
用戶瀏覽行為監控是整個系統的核心功能,為了實現監控目標,應能夠在用戶訪問不良網址前就對這個網址進行屏蔽,在用戶所瀏覽頁面已經下載完畢,但呈現給用戶之前就能夠對其中的不良信息以頁面替換、腳本執行等形式進行處理和告警。為實現上述功能,首先需要捕獲瀏覽器的部分事件并進行相應操作。進行ATL開發并插入 “IE ATL對象”后,系統會默認生成 “Invoke”函數,提供瀏覽器事件捕獲的接口。
事件1:捕獲 “DISPID_BEFORENAVIGATE2”事件,并記錄用戶瀏覽網址。若網址包含在非法網站網址列表中,則直接屏蔽該網站。
事件2:捕獲 “DISPID_DOCUMENTCOMPLETE”事件,并獲取用戶瀏覽器所獲取的HTML源文件以及當前瀏覽器窗口對象,為頁面過濾、替換、告警等提供支撐。若源文件中包含敏感詞,則直接進行過濾操作。
網站屏蔽和網頁過濾使用頁面替換及腳本執行的方式實現,具體處理方式如下:
網站屏蔽:將用戶瀏覽的頁面替換為空白頁或警告頁,同時使用腳本執行的方式彈出告警信息。
網頁過濾:將用戶瀏覽的頁面替換為指定頁面或將敏感詞剔除后返回給用戶,同時使用腳本執行的方式彈出告警信息。
以上過程中涉及的幾個關鍵操作如下:
操作1 在 “Invoke”函數中取參數 “pDispParams”相關字段獲取用戶瀏覽網址;
操作2 使用 “get_Document”函數獲取HTML源文件;
操作3 使用 “get_parentWindow”函數獲取用戶瀏覽器窗口對象指針;
操作4 使用 “put_innerHTML”函數實現頁面替換;
操作5 使用 “execScript”函數實現腳本執行,該操作需依托用戶瀏覽器窗口對象實現。
(1)系統設計架構
針對網頁過濾的應用需求,系統應實現以下功能:
1) 對于指定網站的過濾;
2)對于包含不良信息的網頁的過濾,包含網頁不良內容的屏蔽替換功能和全網頁屏蔽功能;
3)對于全網用戶違規網站和不良網頁訪問行為的監控;
4)對用戶違規訪問行為的告警和記錄。
為實現上述功能,系統設計架構見圖2。整個系統使用C/S模式,包含監控服務器和客戶端兩個部分,其中客戶端安裝于受監控的客戶端主機上,實現對宿主機用戶Web瀏覽行為的監控;服務器則安裝于網內專用服務器上,以實現全網用戶行為的監控。
從數據交互的角度看,管理員負責配置網址庫和敏感詞庫的內容,這些內容通過服務器的過濾信息更新模塊傳遞給客戶端的相應模塊并寫入客戶端本地網址庫和敏感詞庫。此外,當對不良頁面實施頁面替換、腳本執行等操作時,需要替換后的頁面源文件和腳本文件,這些信息也通過過濾更新模塊由服務器傳遞給客戶端并寫入客戶端本地文件系統。頁面過濾模塊以本地的網址庫和敏感詞庫為依據,對不良網站和頁面進行過濾。對于需要進行頁面替換的,則從本地文件系統中讀取相應文件進行頁面替換;對需要進行提示警告的,從本地文件系統取腳本文件執行。客戶端本地的監控結果通過狀態監控模塊定期返回給服務器,寫入服務器結果庫并呈現給管理員用戶。
客戶端包含3個底層數據庫和3個功能模塊,其中網址庫、敏感詞庫和本地結果庫分別存放了需要過濾的網址、敏感詞,以及本地用戶不良Web瀏覽行為的監控結果。網頁過濾模塊包含網址過濾、頁面內容檢查、頁面替換和腳本執行等子模塊,分別實現對指定網址的過濾、對宿主機用戶所瀏覽的頁面進行內容檢查、對頁面內不良的內容進行替換以及針對用戶訪問不良頁面的行為用腳本執行的方式進行提示警告的功能。過濾信息更新模塊負責對網址庫和敏感詞庫的內容進行更新。狀態監控模塊負責本地系統的運行狀態監控,并將本地監控結果上報給服務器。

圖2 系統結構
服務器也包含3個底層數據庫和3個功能模塊,其中網址庫、敏感詞庫和本地結果庫分別存放了需要過濾的網址、敏感詞,以及所有客戶端用戶不良Web瀏覽行為的監控結果。過濾信息更新模塊負責將網址庫和敏感詞庫的內容向各個客戶端進行更新。狀態監控模塊負責所有客戶端的運行狀態監控,并負責接收所有客戶端的監測結果。管理員接口模塊與用戶直接交互,接收管理員的配置信息并向其返回結果。
(2)改進策略
改進1 捎帶的客戶端主機心跳信號發送機制。
對于服務器而言,需要監控每個客戶端的運行狀態。為實現這一功能,在設計時引入 “心跳”機制,即客戶端定期向服務器發送 “心跳”信號以向服務器證明自己處于開機、在線及正常運行狀態,相應的服務器則定期檢測每個客戶端的心跳信號發送情況,以此協作實現狀態監控目的。此外,客戶端還要向服務器定期報告宿主機頁面瀏覽的監控結果。綜合考慮上述兩個因素,為提高系統運行效率,在心跳信號發送方面采用以下策略:
策略1 心跳信號內容為宿主機頁面瀏覽監控結果;
策略2 客戶端初始啟動時向服務器發送登錄信號,格式同宿主機頁面瀏覽監控結果,內容為空;
策略3 客戶端啟動后,每隔Th時間段向服務器發送“心跳”信號,若到期無頁面瀏覽監控結果,則內容為空;
策略4 服務器保存一個客戶端狀態表,存放心跳信息及最近一次 “心跳”信號接收時間;
策略5 服務器設置定期檢測狀態表,時間間隔為Th,查看每個客戶端最后一次 “心跳”信號接收時間距離當前時間的間隔Tl;
策略6 若Tl>=3* Th,則向客戶端發送狀態查詢信號;
策略7 客戶端若收到服務器的狀態查詢信號,則返回3倍Th時間段內的狀態信息;
策略8 若服務器未收到客戶端返回的狀態查詢信號,則認為客戶端下線。
Tl設置為Th3倍的原因在于防止心跳信號丟失造成的誤判,策略7配合該策略使用,以防止頁面瀏覽監控結果的丟失。
改進2 模塊化實現以提高系統適用性。
如前所述,系統需滿足兩類需求,即個人用戶和機構用戶。上述C/S模式適用于機構用戶。考慮到個人用戶的需求,系統采用模塊化設計。用于個人用戶時,狀態監控模塊不安裝。此外,系統發布站點后臺設置過濾信息更新模塊,與客戶端的相應模塊進行通信以便進行過濾網址和關鍵詞等信息的更新。
基于上述設計,整個系統最終實現見圖3。其中服務器組件包括一個用戶接口 (user interface),兩個功能線程,一個定時器,一個隊列和一個數據庫。“Client State”隊列中包含了客戶端狀態報告信息,數據庫中設置不同的表,分別存放監控結果、敏感詞和需過濾網址。狀態監控線程(state thread)實現兩個功能,一是開啟網絡端口,接收客戶端報告信息;二是通過定時器控制定期檢測 “Client State”隊列中各個客戶端的報告信息。過濾信息更新線程(state update)實現數據庫中的數據更新。

圖3 系統實現組件組成
客戶端組件包括一個定時器,兩個功能線程,一個DLL和一個數據庫。其中數據庫中包含不同的表,分別存放監控結果、敏感詞和需過濾網址。狀態監控線程 (state thread)通過定時器控制,開啟網絡端口,向服務器定時報告信息并接受服務器的查詢信息。過濾信息更新線程(state update)開啟網絡端口,從服務器接收更新數據。“WebPage.dll”是整個系統的核心組件,基于BHO實現用戶網頁瀏覽行為的監控。這個DLL的功能隨著IE瀏覽器的啟動而加載。
系統使用VC6.0平臺開發,開發語言為C++,數據庫管理系統采用SQL Server 2005,網絡通信部分使用Win-Sock2,最終的協同界面如圖4所示。

圖4 系統界面
本文設計并實現了一個基于BHO劫持技術的網頁信息過濾系統。由于使用了微軟 “合法”的BHO插件技術并采用了恰當的模塊化設計方案,相對針對個人用戶的過濾系統和針對機構用戶的上網行為審計設備而言,本文的系統能夠以較小的代價和靈活的部署方式同時滿足上述兩種環境下的網站屏蔽和網頁過濾的應用需求,具有良好的實用性和通用性。
:
[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).[百 度 文 庫.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技術的惡意網頁行為檢測方法 [J].廣西大學學報 (自然科學版),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的網站過濾系統研究與實現 [J].計算機工程與應用,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].計算機應用研究,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). [王娟,郭永沖,王強.基于BHO的網絡隱蔽通道研究 [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 知 識庫.如何使用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++開發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].遼寧師專學報,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.