本發(fā)明屬于計(jì)算機(jī)技術(shù)領(lǐng)域,涉及一種實(shí)現(xiàn)流式和多模式快速查找網(wǎng)頁中url鏈接的方法。
背景技術(shù):
url,統(tǒng)一資源定位符,用于唯一的標(biāo)識(shí)萬維網(wǎng)上的某個(gè)資源。通常,網(wǎng)頁中url確定后是不變的,如“http://xxx.xxx.xxx/xxx/xxx.html”、“/xxx/xxx/xxx/”、“./xxx/xxx”、“../../xxx/xxx.css”等。網(wǎng)頁中url的不變性使得黑客對(duì)web應(yīng)用攻擊可以構(gòu)造相關(guān)攻擊載荷,進(jìn)行各種攻擊。如能通過代理對(duì)服務(wù)器解析用戶請(qǐng)求后返回響應(yīng)中網(wǎng)頁所包含的url鏈接進(jìn)行動(dòng)態(tài)隨機(jī)變化,可以有效防御針對(duì)web應(yīng)用的攻擊。通常,網(wǎng)頁中的url置于“href”、“imgsrc”、“form”、“backgorund”、“embedsrc”等標(biāo)簽中或是關(guān)鍵詞后。很明顯,快速找到響應(yīng)中網(wǎng)頁所包含的鏈接并將其替換,能有效減少url動(dòng)態(tài)變化防御方法對(duì)系統(tǒng)性能的影響。
目前,常用的網(wǎng)頁鏈接查找方法有:(1)基于全文利用正則表達(dá)式方法或利用快速字符串匹配方法,如kmp算法;(2)基于流式的字符串匹配方法,如用于處理xml文件的sax處理方法。
其中基于全文的方法需要緩存網(wǎng)頁數(shù)據(jù),對(duì)代理服務(wù)器的空間復(fù)雜度要求較高。一般的字符串匹配方法缺少對(duì)流式數(shù)據(jù)和多模式字符串匹配的考慮,并不能直接應(yīng)用。sax處理方法則對(duì)各種標(biāo)簽考慮過多,導(dǎo)致其性能不是太好。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是為了解決目前url動(dòng)態(tài)變化防御方法中對(duì)網(wǎng)頁中鏈接的快速、流式和多模式查找的要求,提出了一種實(shí)現(xiàn)流式和多模式快速查找網(wǎng)頁中url鏈接的方法。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案包括如下步驟:
步驟1:初始化系統(tǒng):創(chuàng)建鏈接標(biāo)簽匹配關(guān)鍵詞字典,在字典中加入要處理的鏈接標(biāo)簽匹配關(guān)鍵詞記錄。
每一條鏈接標(biāo)簽匹配關(guān)鍵詞記錄包含一個(gè)左端邊界、一個(gè)右端邊界、一個(gè)左端邊界需匹配位置、一個(gè)右端邊界需匹配位置以及該鏈接標(biāo)簽匹配關(guān)鍵詞的處理函數(shù)。
設(shè)當(dāng)前正在匹配的鏈接標(biāo)簽匹配關(guān)鍵詞為空,同時(shí)設(shè)標(biāo)簽跨數(shù)據(jù)塊標(biāo)記為假。
步驟2:讀取web服務(wù)器返回的一個(gè)響應(yīng)數(shù)據(jù)包,將響應(yīng)數(shù)據(jù)包的第一個(gè)字節(jié)地址設(shè)為數(shù)據(jù)處理起始點(diǎn)。
步驟2.1:讀取響應(yīng)數(shù)據(jù)包中的當(dāng)前字節(jié),判斷是否為響應(yīng)數(shù)據(jù)包結(jié)束標(biāo)記。如果該字節(jié)不是響應(yīng)數(shù)據(jù)包的結(jié)束標(biāo)記,跳轉(zhuǎn)到步驟2.2;否則跳轉(zhuǎn)到步驟3。
步驟2.2:檢查當(dāng)前正在匹配的鏈接標(biāo)簽匹配關(guān)鍵詞是否為空,如果不為空跳轉(zhuǎn)到步驟2.6。否則,跳轉(zhuǎn)到步驟2.3。
步驟2.3:將讀取的當(dāng)前字節(jié)與鏈接標(biāo)簽關(guān)鍵詞字典中所有標(biāo)簽關(guān)鍵詞的左端邊界進(jìn)行匹配。
將讀取的當(dāng)前字節(jié)與鏈接標(biāo)簽關(guān)鍵詞字典中的一個(gè)標(biāo)簽關(guān)鍵詞的左端邊界進(jìn)行匹配的流程為:
如果讀取的當(dāng)前字節(jié)與該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置對(duì)應(yīng)的字節(jié)相等,則將該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置后移一個(gè)位置。否則,將該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置重置到初始位置,并再次檢查該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置對(duì)應(yīng)的字節(jié)是否與讀取的字節(jié)相同,如相同則將該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置后移一個(gè)位置。
如果某一標(biāo)簽關(guān)鍵詞的左端邊界已經(jīng)被完全匹配,則設(shè)置該標(biāo)簽關(guān)鍵詞為當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞,跳轉(zhuǎn)到步驟2.4。否則將讀取的字節(jié)與標(biāo)簽關(guān)鍵詞字典中的一個(gè)標(biāo)簽關(guān)鍵詞的左端邊界進(jìn)行匹配的流程重復(fù)進(jìn)行,直至所有標(biāo)簽關(guān)鍵詞都和該讀取的字節(jié)進(jìn)行過匹配,然后跳轉(zhuǎn)到步驟2.5。
步驟2.4:提取數(shù)據(jù)處理起始點(diǎn)與當(dāng)前讀取的數(shù)據(jù)之間的數(shù)據(jù),并將提取的數(shù)據(jù)放入非標(biāo)簽數(shù)據(jù)緩沖區(qū)中。
步驟2.5:將數(shù)據(jù)包的當(dāng)前處理字節(jié)位置向后移動(dòng)一個(gè)位置,跳到步驟2.1。
步驟2.6:將讀取的字節(jié)與當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞的右端邊界進(jìn)行匹配。如果當(dāng)前讀取的字節(jié)與當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置對(duì)應(yīng)的字節(jié)相等,將當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置后移一個(gè)位置。否則,將該標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置移到起始位置,并檢查該標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置對(duì)應(yīng)的字節(jié)是否與當(dāng)前讀取的字節(jié)相同,如相同則將該標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置后移一個(gè)位置。如果該標(biāo)簽關(guān)鍵詞的右端邊界已經(jīng)被完全匹配,跳轉(zhuǎn)到步驟2.7。否則,跳轉(zhuǎn)到步驟3。
步驟2.7:如果標(biāo)簽跨數(shù)據(jù)包標(biāo)記為假,則將標(biāo)簽左端邊界與右端邊界之間的數(shù)據(jù)添加到待處理鏈接緩沖區(qū)中;否則,將數(shù)據(jù)處理起始點(diǎn)與當(dāng)前處理關(guān)鍵詞右端邊界之間的數(shù)據(jù)添加到待處理鏈接數(shù)據(jù)緩沖區(qū)之中。跳轉(zhuǎn)到步驟2.8。
步驟2.8:調(diào)用該標(biāo)簽關(guān)鍵詞對(duì)應(yīng)的轉(zhuǎn)換函數(shù)處理待處理鏈接數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù),然后將非標(biāo)簽緩沖區(qū)數(shù)據(jù)和處理后的待處理標(biāo)簽緩存區(qū)數(shù)據(jù)合并后發(fā)送給客戶端,再將數(shù)據(jù)處理起始點(diǎn)定位到右端邊界之后,同時(shí)清空非標(biāo)簽緩沖區(qū)以及待處理鏈接緩沖區(qū)數(shù)據(jù),重置所有標(biāo)簽關(guān)鍵詞左端邊界和右端邊界的需匹配位置到起始位置,重設(shè)標(biāo)簽跨數(shù)據(jù)包標(biāo)記為假。跳轉(zhuǎn)到步驟2.5。
步驟3:如果還未完全匹配左端邊界,跳轉(zhuǎn)到步驟3.1;否則,到步驟3.2。
步驟3.1:將數(shù)據(jù)處理起始點(diǎn)與該數(shù)據(jù)包結(jié)束位置之間的內(nèi)容添加到非標(biāo)簽緩沖區(qū)中,跳轉(zhuǎn)到步驟4。
步驟3.2:如果標(biāo)簽跨數(shù)據(jù)包標(biāo)記為假,將左端邊界與當(dāng)前讀取到的數(shù)據(jù)之間的內(nèi)容添加到待處理鏈接緩沖區(qū)之中,設(shè)或右端邊界為真,跳轉(zhuǎn)到步驟4;否則,跳轉(zhuǎn)到步驟3.3。
步驟3.3:將數(shù)據(jù)處理起始點(diǎn)與當(dāng)前讀取字節(jié)位置之間的數(shù)據(jù)添加到待處理鏈接緩沖區(qū),跳轉(zhuǎn)到步驟4。
步驟4:重復(fù)步驟2-3,直到該響應(yīng)的所有數(shù)據(jù)包處理完畢,然后跳轉(zhuǎn)到步驟5:
步驟5:如果非標(biāo)簽緩沖區(qū)不為空,則將非標(biāo)簽緩沖區(qū)數(shù)據(jù)發(fā)送給客戶端。
本發(fā)明有益效果如下:
本發(fā)明的一種html網(wǎng)頁中鏈接的快速查找系統(tǒng)能夠?qū)崿F(xiàn)網(wǎng)頁中的url鏈接快速查找提取。經(jīng)過url鏈接提取后,能對(duì)提取出的url進(jìn)行個(gè)性化操作。
該方法有效減少查找時(shí)間,并且能夠應(yīng)對(duì)多模式的提取。為解決url動(dòng)態(tài)變化防御等方法提高了效率,從而更加高效地解決了xss、代碼注入、鏈接釣魚等攻擊。
利用流式思想,對(duì)收到的數(shù)據(jù)包即可進(jìn)行操作并轉(zhuǎn)發(fā),不需要對(duì)所有數(shù)據(jù)進(jìn)行緩存才能進(jìn)行操作,提高了時(shí)間效率的同時(shí)也減輕了代理服務(wù)器的負(fù)擔(dān)。
利用類似于自動(dòng)機(jī)的初步查找方法使得查找提取url時(shí)不會(huì)產(chǎn)生回溯,極大地提高了查找提取效率。
此外,該系統(tǒng)在對(duì)url鏈接進(jìn)行查找提取時(shí)會(huì)對(duì)多個(gè)關(guān)鍵詞進(jìn)行匹配,并且能夠自行修改關(guān)鍵詞字典,不會(huì)只針對(duì)特定的一種關(guān)鍵詞進(jìn)行提取,增強(qiáng)了系統(tǒng)的健壯性。
綜上,url快速查找系統(tǒng)能有效提高對(duì)網(wǎng)頁中url鏈接查找的效率,對(duì)解決目前url動(dòng)態(tài)變化防御方法中對(duì)網(wǎng)頁中鏈接的快速、流式和多模式查找的要求提供了較好的幫助。
附圖說明
圖1為url鏈接提取系統(tǒng)架構(gòu)圖。
圖2為部署url鏈接提取系統(tǒng)后用戶訪問網(wǎng)站的業(yè)務(wù)流程圖。
圖3為初步提取url鏈接流程圖。
圖4(a)為匹配左端邊界流程圖。
圖4(b)為匹配右端邊界流程圖。
具體實(shí)施方式
下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明的具體實(shí)施方案作進(jìn)一步詳細(xì)描述作進(jìn)一步說明。
一種實(shí)現(xiàn)流式和多模式快速查找網(wǎng)頁中url鏈接的方法,如圖1-3所示,具體流程如下:
步驟1:初始化系統(tǒng),創(chuàng)建鏈接標(biāo)簽匹配關(guān)鍵詞字典,加入要處理的鏈接標(biāo)簽匹配關(guān)鍵詞記錄。每一條鏈接標(biāo)簽匹配關(guān)鍵詞記錄包含一個(gè)左端邊界、一個(gè)右端邊界、一個(gè)左端邊界需匹配位置、一個(gè)右端邊界需匹配位置及該標(biāo)簽關(guān)鍵詞的處理函數(shù)。此處加入href關(guān)鍵詞,左端邊界為href=,右端邊界為>,處理函數(shù)為processhref;imgsrc關(guān)鍵詞,左端邊界為imgsrc=,右端邊界為>,處理函數(shù)為processhref;form關(guān)鍵詞,左端邊界為<form,右端邊界為>,處理函數(shù)為processform;background關(guān)鍵詞,左端邊界為background=,右端邊界為>,處理函數(shù)為processhref;embedsrc關(guān)鍵詞,左端邊界為embedsrc=,右端邊界為>,處理函數(shù)為processhref。設(shè)當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞為空,同時(shí)設(shè)標(biāo)簽跨數(shù)據(jù)塊標(biāo)記為假。
步驟2:讀取web服務(wù)器返回的一個(gè)響應(yīng)數(shù)據(jù)包。將響應(yīng)數(shù)據(jù)包的第一個(gè)字節(jié)地址設(shè)為數(shù)據(jù)處理起始點(diǎn)。
步驟2.1:讀取數(shù)據(jù)包中的當(dāng)前字節(jié),判斷是否為數(shù)據(jù)包結(jié)束標(biāo)記。如果該字節(jié)非數(shù)據(jù)包結(jié)束標(biāo)記,跳轉(zhuǎn)到步驟2.2。否則,跳轉(zhuǎn)到步驟3。
步驟2.2:檢查當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞是否為空,如果不為空跳轉(zhuǎn)到步驟2.6。否則,跳轉(zhuǎn)到步驟2.3。
步驟2.3:將讀取的字節(jié)與鏈接標(biāo)簽關(guān)鍵詞字典中所有標(biāo)簽關(guān)鍵詞的左端邊界進(jìn)行匹配。
如圖4(a)所示,將讀取的字節(jié)與鏈接標(biāo)簽關(guān)鍵詞字典中的一個(gè)標(biāo)簽關(guān)鍵詞的左端邊界進(jìn)行匹配的流程為:
如果讀取的字節(jié)與該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置對(duì)應(yīng)的字節(jié)相等,則將該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置后移一個(gè)位置。否則,將該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置重置到初始位置,并檢查該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置對(duì)應(yīng)的字節(jié)是否與讀取的字節(jié)相同,如相同則將該標(biāo)簽關(guān)鍵詞的左端邊界需匹配位置后移一個(gè)位置。
如果某一標(biāo)簽關(guān)鍵詞的左端邊界已經(jīng)被完全匹配,則設(shè)置該標(biāo)簽關(guān)鍵詞為當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞,跳轉(zhuǎn)到步驟2.4。否則重復(fù)將讀取的字節(jié)與標(biāo)簽關(guān)鍵詞字典中的一個(gè)標(biāo)簽關(guān)鍵詞的左端邊界進(jìn)行匹配的流程,直至所有標(biāo)簽關(guān)鍵詞都和該讀取的字節(jié)進(jìn)行過匹配,然后跳轉(zhuǎn)到步驟2.5。
步驟2.4:提取數(shù)據(jù)處理起始點(diǎn)與當(dāng)前讀取的數(shù)據(jù)所在之間數(shù)據(jù),放入非標(biāo)簽數(shù)據(jù)緩沖區(qū)中。
步驟2.5:將數(shù)據(jù)包的當(dāng)前處理字節(jié)位置向后移動(dòng)一個(gè)位置,跳到步驟2.1。
步驟2.6:將讀取的字節(jié)與當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞的右端邊界進(jìn)行匹配。如圖4(b)所示,如果當(dāng)前讀取的字節(jié)與當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置對(duì)應(yīng)的字節(jié)相等,將當(dāng)前正在匹配的標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置后移一個(gè)位置。否則,將該標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置重置為初始位置,并檢查該標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置對(duì)應(yīng)的字節(jié)是否與當(dāng)前讀取的字節(jié)相同,如相同則將該標(biāo)簽關(guān)鍵詞的右端邊界需匹配位置后移一個(gè)位置。如果該標(biāo)簽關(guān)鍵詞的右端邊界已經(jīng)被完全匹配,跳轉(zhuǎn)到步驟2.7。否則,跳轉(zhuǎn)到步驟3。
步驟2.7:如果標(biāo)簽跨數(shù)據(jù)包標(biāo)記為假,則將左右端邊界之間的數(shù)據(jù)添加到待處理鏈接緩沖區(qū)中;否則,將數(shù)據(jù)處理起始點(diǎn)與當(dāng)前處理關(guān)鍵詞右端邊界之間的數(shù)據(jù)添加到待處理鏈接數(shù)據(jù)緩沖區(qū)之中。跳轉(zhuǎn)到步驟2.8。
步驟2.8:調(diào)用該標(biāo)簽關(guān)鍵詞對(duì)應(yīng)的轉(zhuǎn)換函數(shù)對(duì)待處理鏈接數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)進(jìn)行處理。如果該標(biāo)簽關(guān)鍵詞的左端邊界為”href=”、”imgsrc=”、”background=”、”embedsrc=”,跳轉(zhuǎn)到步驟2.9;如果為”<form”,跳轉(zhuǎn)到步驟2.10。
步驟2.9:該類標(biāo)簽關(guān)鍵詞的url就位于這些標(biāo)簽關(guān)鍵詞的左端邊界之后的第一個(gè)引號(hào)和第二個(gè)對(duì)應(yīng)引號(hào)之間,因此找出第一個(gè)引號(hào)和第二個(gè)對(duì)應(yīng)引號(hào)的位置,兩個(gè)引號(hào)之間的數(shù)據(jù)便是精確的url。將url之前的數(shù)據(jù)與之后的數(shù)據(jù)緩存。跳轉(zhuǎn)到步驟2.11。
步驟2.10:該類標(biāo)簽關(guān)鍵詞的url位于關(guān)鍵詞action之后的第一個(gè)引號(hào)和第二個(gè)對(duì)應(yīng)引號(hào)之間,因此先找出待處理鏈接緩沖區(qū)中的action關(guān)鍵詞,隨后找出位于action后的兩個(gè)引號(hào)的位置,兩個(gè)引號(hào)之間的數(shù)據(jù)便是精確的url。將url之前的數(shù)據(jù)與之后的數(shù)據(jù)緩存。跳轉(zhuǎn)到步驟2.11。
步驟2.11:將真實(shí)url轉(zhuǎn)化為虛擬url。然后將之前緩存的數(shù)據(jù)同虛擬url合并,替換待處理鏈接緩沖區(qū)的數(shù)據(jù)。跳轉(zhuǎn)到步驟2.12。
步驟2.12:將非標(biāo)簽緩沖區(qū)數(shù)據(jù)和處理后的待處理標(biāo)簽緩存區(qū)數(shù)據(jù)合并后發(fā)送給客戶端,再將數(shù)據(jù)處理起始點(diǎn)定位到右端邊界之后,同時(shí)清空非標(biāo)簽緩沖區(qū)以及待處理鏈接緩沖區(qū)數(shù)據(jù),重置所有標(biāo)簽關(guān)鍵詞左端邊界和右端邊界的需匹配位置到初始位置,重設(shè)標(biāo)簽跨數(shù)據(jù)包標(biāo)記為假。跳轉(zhuǎn)到步驟2.5。
步驟3:如果還未完全匹配左端邊界,跳轉(zhuǎn)到步驟3.1;否則,到步驟3.2。
步驟3.1:將數(shù)據(jù)處理起始點(diǎn)與該數(shù)據(jù)包結(jié)束位置之間的內(nèi)容添加到非標(biāo)簽緩沖區(qū)中,跳轉(zhuǎn)到步驟4。
步驟3.2:如果標(biāo)簽跨數(shù)據(jù)包標(biāo)記為假,將左端邊界與當(dāng)前讀取到的數(shù)據(jù)之間的內(nèi)容添加到待處理鏈接緩沖區(qū)之中,設(shè)或右端邊界為真,跳轉(zhuǎn)到步驟4;否則,跳轉(zhuǎn)到步驟3.3。
步驟3.3:將數(shù)據(jù)處理起始點(diǎn)與當(dāng)前讀取字節(jié)位置之間的數(shù)據(jù)添加到待處理鏈接緩沖區(qū),跳轉(zhuǎn)到步驟4。
步驟4:重復(fù)步驟2-3,直到該響應(yīng)的所有數(shù)據(jù)包處理完畢,然后跳轉(zhuǎn)到步驟5:
步驟5:如果非標(biāo)簽緩沖區(qū)不為空,則將非標(biāo)簽緩沖區(qū)數(shù)據(jù)發(fā)送給客戶端。
本發(fā)明并不局限于上述實(shí)施步驟,本領(lǐng)域技術(shù)人員還可據(jù)此做出多種變化,但任何與本發(fā)明等同或者類似的變化都應(yīng)涵蓋在本發(fā)明權(quán)利要求的范圍內(nèi)。