□ 玉易 鄧學(xué)彥
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展和廣泛應(yīng)用,網(wǎng)絡(luò)安全問(wèn)題也變得越來(lái)越嚴(yán)重。在日常的網(wǎng)站維護(hù)和安全管理中,網(wǎng)站版本每次上線或例行代碼變更時(shí),網(wǎng)站運(yùn)維人員都必須對(duì)網(wǎng)站數(shù)據(jù)進(jìn)行排查,但網(wǎng)站CMS系統(tǒng)中網(wǎng)頁(yè)數(shù)據(jù)量巨大,無(wú)法人工一一查看。為提高網(wǎng)站運(yùn)維人員的工作效率,我們利用Python語(yǔ)言中正則表達(dá)式和去重算法編寫程序,對(duì)網(wǎng)站CMS系統(tǒng)引用的URL地址進(jìn)行快速統(tǒng)計(jì),查找可疑地址,排除了風(fēng)險(xiǎn)隱患。
Python是一種高級(jí)編程語(yǔ)言,采用解釋運(yùn)行的方式,編寫后無(wú)需編譯即可直接通過(guò)解釋器執(zhí)行,編程效率極高,在各編程語(yǔ)言中位居前列。正則表達(dá)式是內(nèi)嵌在Python中的編程語(yǔ)言,通過(guò)re模塊實(shí)現(xiàn),基本功能是匹配、替換和提取。構(gòu)造正則表達(dá)式,是通過(guò)將元字符與普通字符按各種方式結(jié)合在一起,用事先定義好的規(guī)則來(lái)匹配或捕獲那些符合某個(gè)模式的文本。正則表達(dá)式的形式為/匹配模式/,其中位于定界符之間的部分就是將要在目標(biāo)對(duì)象中進(jìn)行匹配的模式①。
利用正則表達(dá)式匹配出網(wǎng)站CMS系統(tǒng)引用的URL地址列表數(shù)據(jù)是包含重復(fù)信息的,因此需要對(duì)其進(jìn)行去重處理。實(shí)現(xiàn)去重的算法常見(jiàn)有如下幾種。
Python中的字典數(shù)字類型是可變?nèi)萜髂P?,能存?chǔ)任意類型對(duì)象。字典的每個(gè)鍵值對(duì)用冒號(hào)分割,每個(gè)對(duì)之間用逗號(hào)分割,整個(gè)字典包括在花括號(hào)中。字典的鍵必須是唯一的,但字典的值不必是唯一,可以取任何數(shù)據(jù)類型。字典格式為:Dict1={key1 :value1,key2 :value2}。
1.Python字典fromkeys()函數(shù)用于創(chuàng)建一個(gè)新字典,語(yǔ)法為 dict.fromkeys(seq[,value]),其中,seq 為字典鍵值列表,value為可選參數(shù)。用fromkeys()方法去重可得到一個(gè)字典實(shí)例,去重之后創(chuàng)建了一個(gè)以源列表元素為鍵,值為 None的新字典(Dict):
unique_urls=[]
unique_urls.extend({}.fromkeys(total_urls).keys())
2.Python字典keys()函數(shù)以列表返回一個(gè)字典所有的鍵,語(yǔ)法為dict.keys(),dict.keys()函數(shù)返回的是一個(gè)字典所有的鍵。利用該方法去重能重新創(chuàng)建一個(gè)新列表實(shí)例,得到去除重復(fù)數(shù)據(jù)后的列表。
在Python中集合有去重的功能,即把一個(gè)有重復(fù)元素的列表或元組等數(shù)據(jù)類型轉(zhuǎn)變成集合時(shí),其中的重復(fù)元素只出現(xiàn)一次,使用set()方法③。舉例如下:使total_urls,unique_urls分別為含有重復(fù)元素的列表和元組,使用set()方法后可轉(zhuǎn)變成不含重復(fù)元素的集合類型。
unique_urls=set(total_urls)
unique_urls=list(unique_urls)
在python中,可使用關(guān)鍵字in來(lái)判斷特定的值是否存在列表中,使用關(guān)鍵字not in來(lái)判斷特定的值不存在列表中。此外,for循環(huán)和關(guān)鍵字in還可遍歷整個(gè)list列表,逐一判斷其中元素的唯一性。
經(jīng)過(guò)速度對(duì)比測(cè)試,我們選用keys()方法來(lái)進(jìn)行去重。
第一步:創(chuàng)建本地文件夾,用于存放數(shù)據(jù)庫(kù)備份文件和導(dǎo)出文件;
第二步:加載數(shù)據(jù)庫(kù)導(dǎo)出SQL文件;
e.compile(r'https?://(?:[-w.]|(?:%[da-fA-F]{2}))+');
第三步:統(tǒng)計(jì)數(shù)據(jù)庫(kù)內(nèi)所有URL出處;
第四步:list列表到dict字典之間互相轉(zhuǎn)換,利用字典key的唯一性去掉了重復(fù)的URL地址,將結(jié)果保存至桌面;
第五步:查找可疑的URL地址,越不規(guī)則的URL越可疑。
本文通過(guò)使用Python編寫程序?qū)W(wǎng)站CMS系統(tǒng)引用的URL進(jìn)行快速安全排查,利用了正則表達(dá)式快速準(zhǔn)確的匹配、替換和提取等功能以及去重算法,在實(shí)際使用中顯著提高了網(wǎng)站運(yùn)維人員日常巡檢的工作質(zhì)量和效率,有力保障了網(wǎng)站的安全。
注釋:
①?gòu)堨o,張妍.正則表達(dá)式及其在信息抽取中的應(yīng)用[J].電腦知識(shí)與技術(shù),2009(15):3867-3868.
②花田半畝2091.Python列表的去重方式[EB/OL].博客園,2020-04-02.https://www.cnblogs.com/longyuu/p/10033820.html.
③Allen-Liu.Python中的集合類型及其操作[EB/OL]CSDN,2017 -07 -27.https://blog.csdn.net/bbc955625132551/article/details/76169197.