基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾方法
【專利摘要】本發(fā)明給出了一種基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾方法。該方法包括HTML依賴關(guān)系的生成、HTML切片的生成、嵌套在HTML里面的JavaScript依賴關(guān)系的生成、JavaScript切片這幾個(gè)功能模塊。以客戶端網(wǎng)頁(yè)的腳本源代碼為輸入,對(duì)腳本源代碼進(jìn)行分析,根據(jù)HTML中的標(biāo)簽中的依賴關(guān)系生成基于HTML的依賴圖,之后跟據(jù)這個(gè)依賴圖生成HTML切片。之后再抽取嵌套在HTML中的JavaScript代碼,對(duì)JavaScript代碼的對(duì)象級(jí)、方法級(jí)、語(yǔ)句級(jí)代碼做出依賴關(guān)系的構(gòu)建,根據(jù)依賴關(guān)系構(gòu)造出相對(duì)應(yīng)的依賴圖,最后根據(jù)切片準(zhǔn)則,用圖的可達(dá)性算法計(jì)算出切片。利用這些分層切片對(duì)網(wǎng)頁(yè)的腳本代碼進(jìn)行層層切片處理,篩選出自己感興趣的內(nèi)容,過(guò)濾掉不感興趣的或者不良的內(nèi)容,以達(dá)到網(wǎng)頁(yè)過(guò)濾的效果。
【專利說(shuō)明】基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明給出了一種基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾的設(shè)計(jì)方案,主要解決對(duì)網(wǎng)頁(yè)中不良信息的過(guò)濾問(wèn)題,屬于信息安全領(lǐng)域。
【背景技術(shù)】
[0002]互聯(lián)網(wǎng)作為一個(gè)開(kāi)放和使用信息資源的全球性網(wǎng)絡(luò),已經(jīng)和正在對(duì)世界各國(guó)的經(jīng)濟(jì)、政治、文化、科技、軍事等各個(gè)領(lǐng)域產(chǎn)生重大影響,使人們的生活方式發(fā)生深刻變化?;ヂ?lián)網(wǎng)的開(kāi)放性、互連性以及使用的高自由性、信息來(lái)源的不可控性等,使得網(wǎng)絡(luò)內(nèi)容安全對(duì)社會(huì)的潛在威脅和危害是不可估量的。隨著互聯(lián)網(wǎng)的迅速普及,“網(wǎng)絡(luò)垃圾”已經(jīng)開(kāi)始侵入我們的生活;黑客也開(kāi)始利用互聯(lián)網(wǎng)進(jìn)行惡意代碼、犯罪軟件的感染和傳播,從中獲取利益;不法分子更是利用互聯(lián)網(wǎng)作為滲透我們國(guó)家的秘密通道。因此,如何有效地過(guò)濾這些非法數(shù)據(jù),如何更有針對(duì)性地提取網(wǎng)頁(yè)內(nèi)容,如何更加準(zhǔn)確快捷地幫助用戶尋找其感興趣的信息,日益成為網(wǎng)絡(luò)安全領(lǐng)域的一個(gè)熱點(diǎn)問(wèn)題。
[0003]以跨平臺(tái)、可擴(kuò)展、結(jié)構(gòu)化等為特點(diǎn)的XML語(yǔ)言(可擴(kuò)展標(biāo)記語(yǔ)言)推出已經(jīng)有幾年的時(shí)間了,但據(jù)統(tǒng)計(jì),互聯(lián)網(wǎng)上信息的載體大部分還是以HTML(超文本標(biāo)記語(yǔ)言)網(wǎng)頁(yè)為主的。因此,對(duì)網(wǎng)頁(yè)信息的處理,尤其是對(duì)HTML網(wǎng)頁(yè)信息的處理已經(jīng)成為互聯(lián)網(wǎng)信息處理的重點(diǎn),并由此產(chǎn)生了一些與互聯(lián)網(wǎng)信息處理有關(guān)的研究領(lǐng)域,如:網(wǎng)頁(yè)的檢索、網(wǎng)頁(yè)分類、網(wǎng)頁(yè)信息抽取、網(wǎng)頁(yè)摘要和新詞預(yù)測(cè)等。這些領(lǐng)域幾乎都是在網(wǎng)頁(yè)正文信息的基礎(chǔ)之上建立的,網(wǎng)頁(yè)正文信息抽取的質(zhì)量和性能會(huì)直接影響到它們的處理結(jié)果和性能,因此網(wǎng)頁(yè)信息的過(guò)濾與抽取對(duì)互聯(lián)網(wǎng)信息處理來(lái)說(shuō)是一個(gè)重要的基礎(chǔ)性的工作和研究課題。
[0004]程序切片是一種重要的程序分析和理解技術(shù),對(duì)程序進(jìn)行切片的過(guò)程就是刪除無(wú)關(guān)代碼的過(guò)程,程序切片技術(shù)在程序調(diào)試、回歸測(cè)試、軟件維護(hù)、程序理解以及逆向工程等方面有著廣泛的應(yīng)用。本專利將程序切片思想與網(wǎng)頁(yè)過(guò)濾技術(shù)相結(jié)合,一方面拓展了程序切片技術(shù)的應(yīng)用領(lǐng)域,另一方面充分利用程序切片結(jié)果,優(yōu)化網(wǎng)頁(yè)過(guò)濾方法。
[0005]參考文獻(xiàn):
[0006][I]蘇小魯,郭文明.基于DOM的HTML網(wǎng)頁(yè)正文信息抽取模塊的設(shè)計(jì)和實(shí)現(xiàn).北京郵電大學(xué)碩士研究生學(xué)位論文,2011.[0007][2]張迎周,徐寶文.一種新型形式化程序切片方法.中國(guó)科學(xué)E輯:信息科學(xué),2008,38(2):161-176.
【發(fā)明內(nèi)容】
[0008]技術(shù)問(wèn)題:本發(fā)明的目的是提出一種基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾方法。該方案從HTML文件中標(biāo)簽、元素以及嵌套在里面的JavaScript之間的依賴關(guān)系出發(fā),對(duì)依賴關(guān)系進(jìn)行分析,構(gòu)建一個(gè)多層次的切片方法來(lái)對(duì)HTML中各個(gè)標(biāo)簽、元素以及嵌套的JavaScript的進(jìn)行切片處理。針對(duì)現(xiàn)有的傳統(tǒng)切片在面向腳本語(yǔ)言切片功能的匱乏以及在的類似于JavaScript這種面向?qū)ο笳Z(yǔ)言存在的效率和準(zhǔn)確率上的技術(shù)瓶頸,本發(fā)明著手于客戶端腳本語(yǔ)言HTML里面標(biāo)簽、元素以及嵌套在HTML中的JavaScript之間的依賴關(guān)系,結(jié)合程序切片技術(shù),提出一種網(wǎng)頁(yè)過(guò)濾的方法。
[0009]技術(shù)方案:本發(fā)明提出了一種基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾方法,包括對(duì)HTML標(biāo)簽和內(nèi)容進(jìn)行切片處理、嵌套在HTML中的JavaScript進(jìn)行切片處理,進(jìn)而達(dá)到對(duì)客戶端網(wǎng)頁(yè)內(nèi)容的過(guò)濾。
[0010]在本發(fā)明中,所有的功能模塊都是基于程序切片技術(shù)的。在網(wǎng)頁(yè)過(guò)濾方法設(shè)計(jì)中,我們?cè)O(shè)計(jì)利用多鐘不同的切片思想,首先針對(duì)客戶端腳本源代碼中的HTML文件中的標(biāo)簽和元素進(jìn)行構(gòu)造依賴關(guān)系的構(gòu)造,而后在嵌套在HTML中的面向?qū)ο笳Z(yǔ)言JavaScript中對(duì)象級(jí)、方法級(jí)以及語(yǔ)句級(jí)等等層次進(jìn)行依賴圖的構(gòu)建。然后對(duì)這些依賴關(guān)系,我們采取逐步求精算法來(lái)分層計(jì)算JavaScript的切片。
[0011]目前的程序切片技術(shù)主要集中在處理面向過(guò)程和面向?qū)ο蟮恼Z(yǔ)言,而網(wǎng)頁(yè)過(guò)濾方法采用的是基于對(duì)象的語(yǔ)言(JavaScript),因此需要對(duì)基于對(duì)象語(yǔ)言的程序切片方法開(kāi)展相關(guān)研究在網(wǎng)頁(yè)檢測(cè)過(guò)程中通過(guò)瀏覽器內(nèi)核解析網(wǎng)頁(yè)源代碼并提取出源代碼,以此作為網(wǎng)頁(yè)檢測(cè)的依據(jù),具體實(shí)現(xiàn)步驟為:
[0012]該方法以圖論知識(shí)為理論基礎(chǔ),以程序切片為技術(shù)手段,通過(guò)超級(jí)文本標(biāo)記語(yǔ)言HTML (HyperTextMarkupLanguage,)以及嵌套在HTML中的一種腳本語(yǔ)言JavaScript中的依賴關(guān)系進(jìn)行切片開(kāi)發(fā)的模型,以達(dá)到對(duì)網(wǎng)頁(yè)源代碼進(jìn)行切片處理;該方法包括文檔對(duì)象模型 HTMLDOM(HTMLDocumentObjectModel,)樹(shù)構(gòu)造、JavaScript 方法級(jí)依賴圖、JavaScript語(yǔ)句級(jí)依賴圖、通過(guò)依賴圖建立切片等這幾個(gè)功能模塊;利用這些分層切片對(duì)網(wǎng)頁(yè)的腳本代碼進(jìn)行層層切片處理,篩選出自己感興趣的內(nèi)容,過(guò)濾掉不感興趣的或者不良的內(nèi)容,以達(dá)到網(wǎng)頁(yè)過(guò)濾的效果,所包含的步驟為:
[0013]步驟I)基于DOM樹(shù)的抽取方式:
[0014]基于DOM樹(shù)的抽取方式是基于單一頁(yè)面的處理,該方式并不關(guān)心頁(yè)面的布局,首先將網(wǎng)頁(yè)轉(zhuǎn)換成DOM樹(shù),根據(jù)所處理頁(yè)面的DOM樹(shù)按照某種算法把網(wǎng)頁(yè)內(nèi)的噪音信息去除,從而抽取出正文信息;
[0015]步驟2)將HTML文檔構(gòu)建成DOM樹(shù)的依賴圖
[0016]DOM把一份文檔表不為一棵樹(shù),DOM樹(shù)中的一切是以最外層的HTML包含兀素即html元素開(kāi)始的,使用樹(shù)的比喻,叫做根元素,從根流出的線表示不同標(biāo)記部分之間的關(guān)系;head和body元素是html根元素的孩子;title是head的孩子,head是title的父親;處在同一層次的且互不包含的兩個(gè)分支之間稱為兄弟關(guān)系,整個(gè)樹(shù)就這樣組織下去,直到最后的葉子節(jié)點(diǎn)變?yōu)閷傩灾禐橹?html, head, body, title均為HTML語(yǔ)言中成對(duì)出現(xiàn)的標(biāo)簽);
[0017]步驟3)根據(jù)DOM依賴圖構(gòu)建切片
[0018]根據(jù)已知的樹(shù)形依賴圖,根據(jù)圖的可達(dá)性算法構(gòu)建出相應(yīng)的切片;
[0019]步驟4)抽取JavaScript代碼
[0020]JavaScript代碼在HTML —般以標(biāo)簽格式存在,編寫程序或者使用開(kāi)放源碼的JavaScript引擎SpiderMonkey工具(一種用C語(yǔ)言實(shí)現(xiàn)的JavaScript腳本引擎)來(lái)抽取JavaScript 代碼;
[0021]步驟5)構(gòu)建出JavaScript程序的依賴關(guān)系[0022]通過(guò)對(duì)JavaScript源程序進(jìn)行基于掃描的語(yǔ)法分析,找出所有的對(duì)象、變量、方法的定義;按照邏輯結(jié)構(gòu)將JavaScript分為對(duì)象層、方法層和語(yǔ)句層,逐層抽取程序語(yǔ)句間的數(shù)據(jù)依賴和控制依賴關(guān)系;通過(guò)對(duì)JavaScript源程序中賦值語(yǔ)句的左值右值,控制語(yǔ)句的謂詞、函數(shù)調(diào)用語(yǔ)句對(duì)實(shí)參和全局變量的影響以及對(duì)象繼承時(shí)的多態(tài)進(jìn)行語(yǔ)義分析;針對(duì)JavaScript中動(dòng)態(tài)定義對(duì)象的模式,實(shí)現(xiàn)對(duì)象中數(shù)據(jù)和方法的統(tǒng)一封裝處理;
[0023]步驟6)基于對(duì)象的系統(tǒng)依賴圖的構(gòu)造方法
[0024]根據(jù)數(shù)據(jù)依賴和控制依賴關(guān)系構(gòu)造出由對(duì)象層次子圖0HG、控制依賴子圖CDG、數(shù)據(jù)依賴子圖DDG三個(gè)基本層次組成的基于對(duì)象的系統(tǒng)依賴圖BOSOG ;0HG描述了基本對(duì)象的結(jié)構(gòu)信息和對(duì)象層次信息,其中的頂點(diǎn)包括每個(gè)對(duì)象的對(duì)象首部頂點(diǎn)、定義在每個(gè)對(duì)象中的每個(gè)方法的方法首部頂點(diǎn):邊包括每個(gè)對(duì)象得對(duì)象首部頂點(diǎn)到與其有繼承關(guān)系的對(duì)象的相應(yīng)對(duì)象首部頂點(diǎn)的繼承邊,由方法首部表示的方法節(jié)點(diǎn)到定義該方法的對(duì)象的對(duì)象首部頂點(diǎn)的類成員邊;當(dāng)一個(gè)對(duì)象和另一個(gè)對(duì)象或者系統(tǒng)結(jié)合時(shí),通過(guò)對(duì)象首部節(jié)點(diǎn)和對(duì)象成員邊就能夠方便的訪問(wèn)方法的信息,同時(shí)圖中子對(duì)象沒(méi)有重新表示從超對(duì)象中CDG中描述了函數(shù)方法的具體語(yǔ)句現(xiàn)過(guò)程,采用繼承的方法,因此消除了對(duì)繼承方法的重復(fù)表示;用靜態(tài)后向切片的方法,包含了方法的多態(tài)性表示;DDG中包括了對(duì)象的實(shí)現(xiàn),消息動(dòng)態(tài)綁定到對(duì)象中的特定方法表 示對(duì)象間的數(shù)據(jù)依賴關(guān)系;
[0025]步驟7) JavaScript切片算法實(shí)現(xiàn)
[0026]根據(jù)JavaScript自身的特點(diǎn)建立JavaScript語(yǔ)言的分層切片模型,采用對(duì)傳統(tǒng)的系統(tǒng)依賴圖進(jìn)行基于對(duì)象擴(kuò)充的方案進(jìn)行JavaScript腳本切片;
[0027]步驟8)相關(guān)的程序片段切分與計(jì)算方法
[0028]利用兩階段圖形可達(dá)性算法逆向遍歷基于對(duì)象的系統(tǒng)依賴圖B0S0G,首先在BOSOG上找出從節(jié)點(diǎn)η出發(fā),沿?cái)?shù)據(jù)依賴邊或者控制依賴邊可以到達(dá)的節(jié)點(diǎn)進(jìn)行標(biāo)記,構(gòu)成程序關(guān)于節(jié)點(diǎn)η的程序切片;其次標(biāo)記在BOSOG中與η相連的節(jié)點(diǎn),然后標(biāo)記跟這些節(jié)點(diǎn)相連的節(jié)點(diǎn),依次計(jì)算到不能找到新的節(jié)點(diǎn)為止,通過(guò)上述遍歷過(guò)程中的節(jié)點(diǎn)標(biāo)記,計(jì)算出相關(guān)的程序片段。
[0029]有益效果:作為網(wǎng)頁(yè)過(guò)濾方法,本發(fā)明基本上實(shí)現(xiàn)了網(wǎng)頁(yè)過(guò)濾所應(yīng)該具有的功能。具有以下的一些特點(diǎn)和創(chuàng)新之處:
[0030]多層次的程序切片技術(shù):本發(fā)明中使用的程序切片技術(shù)是基于層次結(jié)構(gòu)依賴圖的程序切片,它不同于傳統(tǒng)的程序切片僅僅在斷言或者語(yǔ)句的細(xì)粒度級(jí)別上的切片方法,它屬于一種多層次的切片方法,在這種切片方法中,不必構(gòu)造整個(gè)程序的系統(tǒng)依賴圖,對(duì)比傳統(tǒng)的切片方法,多層次的切片方法有如下的優(yōu)點(diǎn):
[0031]?復(fù)雜度低:
[0032]構(gòu)造依賴圖的復(fù)雜度取決于以下元素:
[0033](I)節(jié)點(diǎn)數(shù)(Vertices),即一個(gè)方法或過(guò)程中謂詞和賦值語(yǔ)句的最大數(shù);
[0034](2)邊數(shù)(Edges),即一個(gè)方法或過(guò)程中邊的最大數(shù);
[0035](3)參數(shù)個(gè)數(shù)(Params),即一個(gè)方法或過(guò)程中形式參數(shù)的最大數(shù);
[0036](4)全局變量數(shù)(Globals),即系統(tǒng)中的全局變量數(shù);
[0037](5)局部變量數(shù)(Locals),即函數(shù)內(nèi)部的局部變量數(shù);
[0038](6)調(diào)用位置數(shù)(CallSites),即一個(gè)方法或過(guò)程中調(diào)用位置的最大數(shù);[0039](7)繼承樹(shù)深度(TreeD印th),即確定可能的間接調(diào)用目標(biāo)的繼承樹(shù)深度;
[0040](8)方法(Methods),即系統(tǒng)中方法或過(guò)程的數(shù)目。
[0041]令ParamVertices (m) = Params+Globals+Locals,則有 SDG 的大小的上界滿足下列條件:
[0042]Size(SDG(m)) = Vertices+CallSites* (1+TreeDepth*(2*ParamVertices(m))) +2*ParamVertices(m)
[0043]利用層次切片,首先不必構(gòu)造整個(gè)程序的系統(tǒng)依賴圖,而是根據(jù)切片準(zhǔn)則構(gòu)造方法級(jí)依賴圖,刪除每個(gè)對(duì)象中與切片準(zhǔn)則無(wú)關(guān)的方法和變量;最后根據(jù)切片準(zhǔn)則構(gòu)造語(yǔ)句級(jí)依賴圖,在每個(gè)方法中刪除與切片準(zhǔn)則無(wú)關(guān)的語(yǔ)句和謂詞等。在分層模型中,由于刪除了所有與切片準(zhǔn)則無(wú)關(guān)的 方法等等,這使得依賴關(guān)系的數(shù)量同樣得到刪減,因而,層次切片模型的復(fù)雜度比傳統(tǒng)的方法低。
[0044]?精確度高:分層切片方法將對(duì)象級(jí)和方法級(jí)的無(wú)關(guān)的對(duì)象和方法排除,而后考慮這些對(duì)象和方法里面變量,語(yǔ)句之間關(guān)系的這些細(xì)節(jié)問(wèn)題,最后選用恰當(dāng)?shù)恼Z(yǔ)句級(jí)依賴圖和切片算法,實(shí)為更為精確的切片。
[0045]?可復(fù)用性強(qiáng):分層切片方法可以將網(wǎng)頁(yè)腳本中的JavaScript都抽取出來(lái)放在一個(gè)源代碼文件中,這個(gè)源代碼文件經(jīng)過(guò)少量修改甚至不需要修改就可以編譯。當(dāng)別人需要調(diào)用這個(gè)構(gòu)件的時(shí)候,只需要使用切片后的代碼。
[0046]基于HTML的切片技術(shù):本發(fā)明客戶端的網(wǎng)頁(yè)源代碼出發(fā),對(duì)網(wǎng)頁(yè)中腳本語(yǔ)言進(jìn)行分析。HTML是由標(biāo)簽和屬性構(gòu)成,因?yàn)镠TML中的每個(gè)標(biāo)簽之間都存在著互相依存的關(guān)系,標(biāo)簽之間存在著相互調(diào)用。一個(gè)HTML文件中所有標(biāo)簽之間的依賴關(guān)系對(duì)于理解網(wǎng)頁(yè)結(jié)構(gòu),分析網(wǎng)頁(yè)結(jié)構(gòu)以及切分網(wǎng)頁(yè)結(jié)構(gòu)都可以起到很重要的作用。本發(fā)明對(duì)HTML中的所有標(biāo)簽進(jìn)行分析,從中抽取出所有標(biāo)簽之間的依賴關(guān)系,得到一個(gè)HTML標(biāo)簽依賴關(guān)系圖,然后用程序切片技術(shù)來(lái)分析這個(gè)標(biāo)簽依賴圖,將某一個(gè)標(biāo)簽作為切片節(jié)點(diǎn),對(duì)標(biāo)簽依賴圖進(jìn)行切片,得到這個(gè)標(biāo)簽所依賴的其他所有標(biāo)簽。將所有切片后得到的標(biāo)簽的定義從HTML文件中抽取出來(lái),生成一個(gè)切片代碼,這個(gè)代碼就包含了運(yùn)行這個(gè)標(biāo)簽所需要的所有的、最精簡(jiǎn)的代碼,從而實(shí)現(xiàn)源代碼的切分,達(dá)到生成網(wǎng)頁(yè)過(guò)濾的目的。
[0047]基于對(duì)象的切片技術(shù):在面向?qū)ο笳Z(yǔ)言切片技術(shù)的基礎(chǔ)上,提出了基于對(duì)象語(yǔ)言的切片算法JavaScript語(yǔ)言是基于對(duì)象的語(yǔ)言。在對(duì)JavaScript程序進(jìn)行語(yǔ)法和語(yǔ)義分析構(gòu)建JavaScript程序的依賴程序?qū)哟文P?,?gòu)造對(duì)象層次子圖、控制依賴與數(shù)據(jù)依賴子圖,從而構(gòu)建基于對(duì)象的系統(tǒng)依賴圖。再次利用依據(jù)網(wǎng)頁(yè)分析模塊構(gòu)建的切片準(zhǔn)則來(lái)逆向遍歷基于對(duì)象的系統(tǒng)依賴圖,最后計(jì)算出相關(guān)的切片
【專利附圖】
【附圖說(shuō)明】
[0048]圖1是本發(fā)明的網(wǎng)頁(yè)過(guò)濾方法的整體流程框圖。
[0049]圖2描述了 JavaScript抽取的過(guò)程。
[0050]圖3描述了 JavaScript切片構(gòu)造的過(guò)程。
[0051]圖4描述了網(wǎng)頁(yè)代碼分層切片模型的過(guò)程。
【具體實(shí)施方式】[0052]本發(fā)明中基于程序切片的Web服務(wù)平臺(tái)包含對(duì)HTML標(biāo)簽和內(nèi)容進(jìn)行切片處理、嵌套在HTML中的JavaScript進(jìn)行切片等功能。
[0053]JavaScript是一種基于對(duì)象的編程語(yǔ)言,不同于其它面向?qū)ο蟮恼Z(yǔ)言,它沒(méi)有類的概念,只有對(duì)象。JavaScript語(yǔ)言的對(duì)象有三個(gè)來(lái)源=JavaScript內(nèi)部對(duì)象、主機(jī)環(huán)境中對(duì)象、程序創(chuàng)建的對(duì)象。任何對(duì)象都可以作為原型對(duì)象與另一個(gè)對(duì)象聯(lián)系起來(lái),允許后一個(gè)對(duì)象來(lái)共享前一個(gè)對(duì)象的所有屬性。JavaScript提供動(dòng)態(tài)繼承,繼承可以根據(jù)單個(gè)對(duì)象的不同而不同。而且還支持不需要任何聲明的函數(shù),函數(shù)可以是對(duì)象的屬性,作為寬松類型的方法被調(diào)用執(zhí)行。
[0054]任一個(gè)對(duì)象都可以定義自己的屬性,不管是在創(chuàng)建階段還是在運(yùn)行階段。JavaScript在運(yùn)行時(shí)可以動(dòng)態(tài)的增加或者刪除任何對(duì)象的屬性。如果為一組對(duì)象的原型對(duì)象增加一個(gè)屬性的話,那么所有繼承于這個(gè)原型對(duì)象的所有對(duì)象都可獲取這個(gè)新增加的屬性。JavaScript沒(méi)有Java等面向?qū)ο笳Z(yǔ)言所具有的靜態(tài)類型,也沒(méi)有嚴(yán)格的類型檢查機(jī)制。但JavaScript支持大部分的Java語(yǔ)言的語(yǔ)法和控制流結(jié)構(gòu)。Java等面向?qū)ο笳Z(yǔ)言的類是通過(guò)聲明來(lái)創(chuàng)建并在編譯階段就固定好了的,而JavaScript支持基于以下幾個(gè)基本數(shù)據(jù)類型的運(yùn)行時(shí)類系統(tǒng):數(shù)字類型,布爾類型和字符串類型。
[0055]圖1給出了本發(fā)明方法的一個(gè)整體的流程框圖,描述了各個(gè)模塊的作用以及模塊之間的聯(lián)系。下面的內(nèi)容是對(duì)本發(fā)明中的網(wǎng)頁(yè)過(guò)濾方法的各個(gè)功能在實(shí)現(xiàn)上的詳細(xì)描述。
[0056]I,將HTML構(gòu)造成DOM樹(shù)
[0057]DOM接口提供了一種通過(guò)分層對(duì)象模型來(lái)訪問(wèn)XML文檔信息的方式,這些對(duì)象模型依據(jù)XML的文檔結(jié)構(gòu),即元素間有序的嵌套結(jié)構(gòu),形成一棵對(duì)象節(jié)點(diǎn)樹(shù),本文中稱此結(jié)構(gòu)為DOM樹(shù),它將XML文檔表示為節(jié)點(diǎn)構(gòu)成的樹(shù)。org.w3c.dom包中的不同接口可以表示元素、屬性、已分析的字符數(shù)據(jù)、注釋和處理指令,它們都是公用Node接口的子接口。Node接口提供了在樹(shù)中導(dǎo)航與處理的基本方法。
[0058]2,對(duì)DOM樹(shù)進(jìn)行切片處理
[0059]DTD切片算法描述:
[0060]DTD切片分兩個(gè)步驟:切片規(guī)則生成、切片文檔生成,以下將討論這兩個(gè)步驟的算法。
[0061]算法I切片規(guī)則生成:
[0062]輸入:DTD文檔dtdFile切片選取的元素節(jié)點(diǎn)集合criterionSet。
[0063]輸出:切片規(guī)則樹(shù)criterionT。
[0064]步驟1:解析dtdFile得到樹(shù)型結(jié)構(gòu)dtdT,獲取dtdT根元素節(jié)點(diǎn)boot ;
[0065]步驟2:如果boot為非空,則轉(zhuǎn)步驟3,否則算法結(jié)束;
[0066]步驟3:從criterionSet中選取一個(gè)元素節(jié)點(diǎn),并在dtdT中搜索,如果存在該元素節(jié)點(diǎn),則轉(zhuǎn)步驟4 ;
[0067]否則算法結(jié)束;
[0068]步驟4:在criterionT中生成從根元素節(jié)點(diǎn)到搜索元素節(jié)點(diǎn)的樹(shù)分支,轉(zhuǎn)步驟3。
[0069]算法2切片文檔生成:
[0070]輸人:HTML文檔 srcHTMLFile,DTD 文檔 dtdFile,切片規(guī)則樹(shù) criterionT。
[0071]輸出:DTD切片文檔 sliceDtdFile, XML 切片文檔 slicedHTMLFile[0072]步驟1:解析sourceFile形成DOM樹(shù)document ;解析dtdFile得到dtd樹(shù)型結(jié)構(gòu)dtdT ;
[0073]步驟2:先序遍歷。criterionT獲取元素節(jié)點(diǎn)node,如果節(jié)點(diǎn)不為空,貝U轉(zhuǎn)步驟3,否則算法結(jié)束;
[0074]步驟3:先序遍歷document獲取與node匹配的元素節(jié)點(diǎn)及其內(nèi)容,寫入slicedHTMLFile ;先序遍歷dtdT獲取與node匹配的元素節(jié)點(diǎn)信息,寫入slicedDtdFile,轉(zhuǎn)步驟2 ;
[0075]3, JavaScript 代碼的抽取
[0076]JavaScript代碼在HTML —般以這樣的格式存在的〈scripttype = "text/javascript"〉和〈/script〉之間,這種是目前嵌入JavaScript的一般方式。JavaScript代碼可以在head區(qū)或body區(qū),但有些區(qū)別。JavaScript代碼隨網(wǎng)頁(yè)的其他元素順序載入,載入后先經(jīng)過(guò)一次語(yǔ)法檢查,然后順序執(zhí)行;如果JavaScript代碼中不包含document,write或document, writeln語(yǔ)句,寫在head區(qū)比較好,因?yàn)檫@樣會(huì)先執(zhí)行。
[0077]根據(jù)已知的網(wǎng)頁(yè),遍歷該網(wǎng)頁(yè)的每個(gè)節(jié)點(diǎn),通過(guò)上述對(duì)JavaScript嵌入方式的分析來(lái)判斷,如果是script節(jié)點(diǎn),并且是JavaScript類型,則分析是文件還是代碼;若是文件,則通過(guò)HTTP請(qǐng)求獲取此文件;若是代碼,直接將這些代碼保存為本地文件。最后將所有JavaScript文件交給程序
[0078]4, JavaScript對(duì)象級(jí)依賴圖
[0079]開(kāi)放源碼的JavaScript引擎SpiderMonkey提供了一個(gè)最基本的且易于擴(kuò)展的JavaScript分析器。通過(guò)包裝SpiderMonkey使其包裝后的接口能接收從頁(yè)面提取的JavaScript 代石馬。
[0080]一個(gè)完整的對(duì)象級(jí)依賴圖除了包含對(duì)象節(jié)點(diǎn)之外,還必須能準(zhǔn)確地反映這些節(jié)點(diǎn)之間的各種依賴關(guān)系。在JavaScript語(yǔ)言的程序中,主要存在以下幾種依賴關(guān)系。
[0081](I)對(duì)象間的創(chuàng)建關(guān)系
[0082]對(duì)象之間的創(chuàng)建關(guān)系是一種委托關(guān)系的具體實(shí)現(xiàn)。一個(gè)對(duì)象在其方法中依靠創(chuàng)建另一種對(duì)象,而后再委托它進(jìn)行部分工作,最后完成自己的工作。這種關(guān)系發(fā)生在一個(gè)對(duì)象在實(shí)現(xiàn)某個(gè)方法時(shí)使用另一個(gè)對(duì)象的時(shí)候。
[0083](2)對(duì)象之間的聚合關(guān)系
[0084]對(duì)象之間的聚合關(guān)系是很常見(jiàn)的。例如飛機(jī)是由機(jī)頭、機(jī)身、機(jī)翼和尾翼等組成,這是一種聚合關(guān)系,它不能用繼承關(guān)系來(lái)描述,但可以用對(duì)象之間的聚合關(guān)系或包含關(guān)系來(lái)描述。這種關(guān)系是直接的。
[0085](3)對(duì)象通信(消息)關(guān)系
[0086]消息流圖描述了系統(tǒng)中對(duì)象間的消息流。目標(biāo)不在于描述系統(tǒng)中的所有消息流,只是描述那些相關(guān)對(duì)象間交換的主要消息。這種圖可以反映相互創(chuàng)建的對(duì)象是如何交互來(lái)完成所賦予的任務(wù)的,這樣就可以檢查設(shè)計(jì)中的缺點(diǎn)。有兩種不同的消息圖,一種描述從一個(gè)對(duì)象到其他對(duì)象的外向消息流;另一種是從其他對(duì)象到本對(duì)象的內(nèi)向消息流。
[0087]5, JavaScript語(yǔ)句級(jí)依賴圖
[0088]語(yǔ)句依賴圖是對(duì)對(duì)象的方法體進(jìn)行分析所得到的,它包括所有語(yǔ)句類型。對(duì)于方法調(diào)用需要分析出方法形參之間的關(guān)系,即是否一部分形參受到另一部分形參的影響即可,通過(guò)形參與實(shí)參的對(duì)應(yīng)關(guān)系把調(diào)用函數(shù)與被調(diào)用函數(shù)聯(lián)系起來(lái)。New語(yǔ)句的處理:如果相應(yīng)的類沒(méi)有構(gòu)造函數(shù),我們則給出缺省的構(gòu)造函數(shù),即給對(duì)象中的每個(gè)數(shù)據(jù)成員賦缺省的初值。
[0089]語(yǔ)句級(jí)依賴圖由語(yǔ)句節(jié)點(diǎn)和語(yǔ)句之間的依賴關(guān)系組成,其中語(yǔ)句節(jié)點(diǎn)可分為以下三大種類型:
[0090](I)復(fù)合語(yǔ)句開(kāi)始節(jié)點(diǎn)
[0091]用語(yǔ)句體第一個(gè)語(yǔ)句的sequence表示,但是要標(biāo)明是語(yǔ)句體開(kāi)始節(jié)點(diǎn)。
[0092](2)復(fù)合語(yǔ)句結(jié)束節(jié)點(diǎn)
[0093]用語(yǔ)句體最后一個(gè)語(yǔ)句的sequence表示,但是要標(biāo)明是語(yǔ)句體結(jié)束節(jié)點(diǎn);復(fù)合語(yǔ)句指:方法體、if-else語(yǔ)句、if-else的肯定部分、if_else的否定部分、switch語(yǔ)句、while語(yǔ)句、do-while語(yǔ)句、for語(yǔ)句。
[0094](3)其他的語(yǔ)句節(jié)點(diǎn)
[0095]I)簡(jiǎn)單語(yǔ)句節(jié)點(diǎn),用該語(yǔ)句的sequence表示;
[0096]2)謂詞節(jié)點(diǎn),即條件語(yǔ)句(包括switch語(yǔ)句)和循環(huán)語(yǔ)句的判斷部分,用該語(yǔ)句謂詞的sequence表示;
[0097]3)方法調(diào)用節(jié)點(diǎn),用該語(yǔ)句的sequence表示;
[0098]4)結(jié)構(gòu)化跳轉(zhuǎn)語(yǔ)句節(jié)點(diǎn),包括break, continue, return語(yǔ)句,用它們的sequence表不。
[0099]語(yǔ)句之間的依賴關(guān)系包括:
[0100]I)數(shù)據(jù)依賴:即變量X在語(yǔ)句節(jié)點(diǎn)i的定義是語(yǔ)句節(jié)點(diǎn)j的一個(gè)到達(dá)定義,則j數(shù)據(jù)依賴于i,該指針是從j指向i;
[0101]2)普通依賴:即一般的順序語(yǔ)句結(jié)構(gòu),如果語(yǔ)句節(jié)點(diǎn)j的下一個(gè)語(yǔ)句節(jié)點(diǎn)是i,則指針從j指向i,由于我們的程序中不存在goto語(yǔ)句,所以我們?cè)诿拷⒁粋€(gè)節(jié)點(diǎn)以后,都和它前面的節(jié)點(diǎn)建立“普通依賴”關(guān)系的連接,這里“普通依賴”關(guān)系只存在于平級(jí)(即同一層次)的語(yǔ)句節(jié)點(diǎn)之間;
[0102]3)控制的依賴關(guān)系:只局限于條件語(yǔ)句和循環(huán)語(yǔ)句內(nèi)部,只要把指針從條件體或循環(huán)體內(nèi)的語(yǔ)句指向條件判斷部分即可。
[0103]6, JavaScript語(yǔ)句級(jí)切片算法
[0104]K.L.0ttenstein等人提出的用于計(jì)算過(guò)程內(nèi)切片的程序依賴圖和S.Horwitz等人提出的用于解決過(guò)程間切片計(jì)算問(wèn)題的系統(tǒng)依賴圖(SDG)都是在語(yǔ)句級(jí)表示程序。我們稱之為語(yǔ)句級(jí)依賴圖。這類依賴圖的節(jié)點(diǎn)表示出現(xiàn)在程序中的語(yǔ)句和斷言。邊表示程序組件之間的依賴關(guān)系。在利用依賴圖的方法中,若一個(gè)切片準(zhǔn)則C在依賴圖G中確定了一個(gè)開(kāi)始節(jié)點(diǎn)n,則關(guān)于C的切片就是G中從η經(jīng)過(guò)依賴邊能夠到達(dá)的節(jié)點(diǎn)相應(yīng)的語(yǔ)句和斷言構(gòu)成的集合(考慮后向切片)或者是G中從C能夠到達(dá)的節(jié)點(diǎn)相應(yīng)的語(yǔ)句和斷言構(gòu)成的集合(考慮前向切片)。
[0105]定義I (語(yǔ)句級(jí)切片準(zhǔn)則)語(yǔ)句級(jí)切片準(zhǔn)則是一個(gè)二元組<η,V, P〉,其中η是程序P的一條語(yǔ)句,V是在η點(diǎn)定義或引用的變量集合。
[0106]定義2 (語(yǔ)句級(jí)切片)語(yǔ)句級(jí)切片是一種程序分解技術(shù)。一個(gè)程序P和一個(gè)切片準(zhǔn)則<η,V, P〉,其中η是程序P中的某條語(yǔ)句,V是在η定義或引用的一個(gè)變量集合,程序P關(guān)于切片準(zhǔn)則 <n,V, P〉的程序切片Slice ?η, V, P?是由程序P中影響變量V在η點(diǎn)的值的語(yǔ)句和謂詞構(gòu)成(后向切片);或由變量V影響的語(yǔ)句和謂詞構(gòu)成(前向切片)。
【權(quán)利要求】
1.一種基于程序切片技術(shù)的網(wǎng)頁(yè)過(guò)濾方法,其特征在于該方法以圖論知識(shí)為理論基礎(chǔ),以程序切片為技術(shù)手段,通過(guò)超級(jí)文本標(biāo)記語(yǔ)言HTML以及嵌套在HTML中的一種腳本語(yǔ)言JavaScript中的依賴關(guān)系進(jìn)行切片開(kāi)發(fā)的模型,以達(dá)到對(duì)網(wǎng)頁(yè)源代碼進(jìn)行切片處理;該方法包括文檔對(duì)象模型HTMLDOM樹(shù)構(gòu)造、JavaScript方法級(jí)依賴圖、JavaScript語(yǔ)句級(jí)依賴圖、通過(guò)依賴圖建立切片等這幾個(gè)功能模塊;利用這些分層切片對(duì)網(wǎng)頁(yè)的腳本代碼進(jìn)行層層切片處理,篩選出自己感興趣的內(nèi)容,過(guò)濾掉不感興趣的或者不良的內(nèi)容,以達(dá)到網(wǎng)頁(yè)過(guò)濾的效果,所包含的步驟為: 步驟I)基于DOM樹(shù)的抽取方式: 基于DOM樹(shù)的抽取方式是基于單一頁(yè)面的處理,該方式并不關(guān)心頁(yè)面的布局,首先將網(wǎng)頁(yè)轉(zhuǎn)換成DOM樹(shù),根據(jù)所處理頁(yè)面的DOM樹(shù)按照某種算法把網(wǎng)頁(yè)內(nèi)的噪音信息去除,從而抽取出正文信息; 步驟2)將HTML文檔構(gòu)建成DOM樹(shù)的依賴圖 DOM把一份文檔表不為一棵樹(shù),DOM樹(shù)中的一切是以最外層的HTML包含兀素即html兀素開(kāi)始的,使用樹(shù)的比喻,叫做根元素,從根流出的線表示不同標(biāo)記部分之間的關(guān)系;head和body元素是html根元素的孩子;title是head的孩子,head是title的父親;處在同一層次的且互不包含的兩個(gè)分支之間稱為兄弟關(guān)系,整個(gè)樹(shù)就這樣組織下去,直到最后的葉子節(jié)點(diǎn)變?yōu)閷傩灾禐橹梗? 步驟3)根據(jù)DOM依賴圖構(gòu)建切片 根據(jù)已知的樹(shù)形依賴圖,根據(jù)圖的可達(dá)性算法構(gòu)建出相應(yīng)的切片; 步驟4)抽取JavaScript代碼 JavaScript代碼在HTML—般以標(biāo)簽格式存在,編寫程序或者使用開(kāi)放源碼的JavaScript 引擎 SpiderMonkey 工具來(lái)抽取 JavaScript 代碼; 步驟5)構(gòu)建出JavaScript程序的依賴關(guān)系 通過(guò)對(duì)JavaScript源程序進(jìn)行基于掃描的語(yǔ)法分析,找出所有的對(duì)象、變量、方法的定義;按照邏輯結(jié)構(gòu)將JavaScript分為對(duì)象層、方法層和語(yǔ)句層,逐層抽取程序語(yǔ)句間的數(shù)據(jù)依賴和控制依賴關(guān)系;通過(guò)對(duì)JavaScript源程序中賦值語(yǔ)句的左值右值,控制語(yǔ)句的謂詞、函數(shù)調(diào)用語(yǔ)句對(duì)實(shí)參和全局變量的影響以及對(duì)象繼承時(shí)的多態(tài)進(jìn)行語(yǔ)義分析;針對(duì)JavaScript中動(dòng)態(tài)定義對(duì)象的模式,實(shí)現(xiàn)對(duì)象中數(shù)據(jù)和方法的統(tǒng)一封裝處理; 步驟6)基于對(duì)象的系統(tǒng)依賴圖的構(gòu)造方法 根據(jù)數(shù)據(jù)依賴和控制依賴關(guān)系構(gòu)造出由對(duì)象層次子圖0HG、控制依賴子圖CDG、數(shù)據(jù)依賴子圖DDG三個(gè)基本層次組成的基于對(duì)象的系統(tǒng)依賴圖BOSOG ;OHG描述了基本對(duì)象的結(jié)構(gòu)信息和對(duì)象層次信息,其中的頂點(diǎn)包括每個(gè)對(duì)象的對(duì)象首部頂點(diǎn)、定義在每個(gè)對(duì)象中的每個(gè)方法的方法首部頂點(diǎn):邊包括每個(gè)對(duì)象得對(duì)象首部頂點(diǎn)到與其有繼承關(guān)系的對(duì)象的相應(yīng)對(duì)象首部頂點(diǎn)的繼承邊,由方法首部表示的方法節(jié)點(diǎn)到定義該方法的對(duì)象的對(duì)象首部頂點(diǎn)的類成員邊;當(dāng)一個(gè)對(duì)象和另一個(gè)對(duì)象或者系統(tǒng)結(jié)合時(shí),通過(guò)對(duì)象首部節(jié)點(diǎn)和對(duì)象成員邊就能夠方 便的訪問(wèn)方法的信息,同時(shí)圖中子對(duì)象沒(méi)有重新表示從超對(duì)象中CDG中描述了函數(shù)方法的具體語(yǔ)句現(xiàn)過(guò)程,采用繼承的方法,因此消除了對(duì)繼承方法的重復(fù)表示;用靜態(tài)后向切片的方法,包含了方法的多態(tài)性表示;DDG中包括了對(duì)象的實(shí)現(xiàn),消息動(dòng)態(tài)綁定到對(duì)象中的特定方法表示對(duì)象間的數(shù)據(jù)依賴關(guān)系;步驟7) JavaScript切片算法實(shí)現(xiàn) 根據(jù)JavaScript自身的特點(diǎn)建立JavaScript語(yǔ)言的分層切片模型,采用對(duì)傳統(tǒng)的系統(tǒng)依賴圖進(jìn)行基于對(duì)象擴(kuò)充的方案進(jìn)行JavaScript腳本切片; 步驟8)相關(guān)的程序片段切分與計(jì)算方法 利用兩階段圖形可達(dá)性算法逆向遍歷基于對(duì)象的系統(tǒng)依賴圖BOSOG,首先在BOSOG上找出從節(jié)點(diǎn)η出 發(fā),沿?cái)?shù)據(jù)依賴邊或者控制依賴邊可以到達(dá)的節(jié)點(diǎn)進(jìn)行標(biāo)記,構(gòu)成程序關(guān)于節(jié)點(diǎn)η的程序切片;其次標(biāo)記在BOSOG中與η相連的節(jié)點(diǎn),然后標(biāo)記跟這些節(jié)點(diǎn)相連的節(jié)點(diǎn),依次計(jì)算到不能找到新的節(jié)點(diǎn)為止,通過(guò)上述遍歷過(guò)程中的節(jié)點(diǎn)標(biāo)記,計(jì)算出相關(guān)的程序片段。
【文檔編號(hào)】G06F17/30GK103970845SQ201410175921
【公開(kāi)日】2014年8月6日 申請(qǐng)日期:2014年4月28日 優(yōu)先權(quán)日:2014年4月28日
【發(fā)明者】張迎周, 孫健, 仉雪玲, 孫韋翠, 高海燕, 陳棟, 王子元, 嵇宇 申請(qǐng)人:南京郵電大學(xué)