本發(fā)明涉及軟件技術(shù),特別是涉及一種防爬蟲(chóng)的方法。
背景技術(shù):
現(xiàn)有技術(shù)中存在通用的、維護(hù)整個(gè)網(wǎng)站安全的防爬蟲(chóng)方法,主要是根據(jù)用戶的訪問(wèn)頻率(一段時(shí)間內(nèi)的訪問(wèn)總數(shù))來(lái)判斷請(qǐng)求是否合法,一旦頻率超過(guò)制定的閥值,就會(huì)通過(guò)輸入驗(yàn)證碼或者直接拒絕訪問(wèn)的方式來(lái)防止惡意爬蟲(chóng)?,F(xiàn)有技術(shù)中的防爬蟲(chóng)方法往往設(shè)置的訪問(wèn)頻率上限太高,防爬力度不夠。惡意爬蟲(chóng)在該上限的安全范圍內(nèi)持續(xù)訪問(wèn)網(wǎng)站,依然可以導(dǎo)致服務(wù)器癱瘓。所以需要制定新的防爬蟲(chóng)方法,以便更有效地打擊惡意爬蟲(chóng)。
技術(shù)實(shí)現(xiàn)要素:
發(fā)明目的:本發(fā)明的目的是提供一種能夠解決現(xiàn)有技術(shù)中存在的缺陷的防爬蟲(chóng)方法。
技術(shù)方案:為達(dá)到此目的,本發(fā)明采用以下技術(shù)方案:
本發(fā)明所述的防爬蟲(chóng)的方法,包括以下步驟:
S1:對(duì)接收到的請(qǐng)求進(jìn)行判斷:如果在白名單內(nèi),則直接進(jìn)行步驟S6;如果不在白名單內(nèi),則判斷是否已被標(biāo)記為爬蟲(chóng),如果已被標(biāo)記為爬蟲(chóng)則進(jìn)行步驟S5,如果沒(méi)有被標(biāo)記為爬蟲(chóng)則進(jìn)行步驟S2;
S2:對(duì)第一預(yù)設(shè)時(shí)間內(nèi)的請(qǐng)求總數(shù)進(jìn)行檢驗(yàn);
S3:對(duì)第二預(yù)設(shè)時(shí)間內(nèi)的子請(qǐng)求和父請(qǐng)求次數(shù)比例進(jìn)行檢驗(yàn);
S4:判斷步驟S2和S3的兩次檢驗(yàn)是否均通過(guò):如果均通過(guò),則進(jìn)行步驟S6;否則,進(jìn)行步驟S5;
S5:攔截所述請(qǐng)求,并返回步驟S1進(jìn)行繼續(xù)判斷;
S6:允許所述請(qǐng)求,并返回步驟S1進(jìn)行繼續(xù)判斷。
進(jìn)一步,所述步驟S1包括以下子步驟:
S1.1:判斷所述請(qǐng)求的ip是否為內(nèi)部ip:如果是,則直接進(jìn)行步驟S6;如果不是,則繼續(xù)步驟S1.2的判斷;
S1.2:用所述請(qǐng)求的ip作為密鑰,從MemCache緩存中查找有關(guān)所述ip的信息:如果查到相關(guān)信息,則檢查所述請(qǐng)求是否已被標(biāo)記為爬蟲(chóng),如果已被標(biāo)記為爬蟲(chóng),則進(jìn)行步驟S5,如果沒(méi)有被標(biāo)記為爬蟲(chóng),則進(jìn)行步驟S2;如果沒(méi)有查到相關(guān)信息,則插入一條新記錄,并進(jìn)行步驟S2。
進(jìn)一步,所述MemCache緩存對(duì)請(qǐng)求的以下信息進(jìn)行存儲(chǔ):1分鐘計(jì)時(shí)、1分鐘之內(nèi)父請(qǐng)求總次數(shù)、5分鐘計(jì)時(shí)、5分鐘之內(nèi)父請(qǐng)求總次數(shù)、5分鐘之內(nèi)子請(qǐng)求總次數(shù)、是否是爬蟲(chóng)。
進(jìn)一步,對(duì)所述MemCache緩存中的記錄設(shè)定自動(dòng)過(guò)期時(shí)間,超過(guò)自動(dòng)過(guò)期時(shí)間后,記錄被刪除。這樣能夠防止錯(cuò)誤封掉了合法的ip。
進(jìn)一步,所述步驟S1中對(duì)接收到的請(qǐng)求進(jìn)行判斷之前,可以直接將接收到的請(qǐng)求攔截,并封掉所述請(qǐng)求對(duì)應(yīng)的ip。這樣能夠直接將惡意請(qǐng)求攔截并封掉ip,提高了方法的安全性。
進(jìn)一步,為了節(jié)約緩存資源,存儲(chǔ)在Memcache中的數(shù)組均采用索引數(shù)組。
進(jìn)一步,所述步驟S2中,對(duì)第一預(yù)設(shè)時(shí)間內(nèi)的請(qǐng)求總數(shù)進(jìn)行檢驗(yàn)采用第一預(yù)設(shè)閥值來(lái)判斷是否通過(guò)檢驗(yàn),請(qǐng)求來(lái)自搜索引擎對(duì)應(yīng)的第一預(yù)設(shè)閥值大于請(qǐng)求來(lái)自其他用戶對(duì)應(yīng)的第一預(yù)設(shè)閥值;所述步驟S3中,對(duì)第二預(yù)設(shè)時(shí)間內(nèi)
有益效果:本發(fā)明從多個(gè)維度判斷請(qǐng)求的合法性,有效提高了攔截爬蟲(chóng)的力度和準(zhǔn)確性,解決了現(xiàn)有技術(shù)中單一通過(guò)訪問(wèn)頻率來(lái)攔截爬蟲(chóng)所帶來(lái)的問(wèn)題。
附圖說(shuō)明
圖1為本發(fā)明的對(duì)一次請(qǐng)求進(jìn)行處理的方法流程圖。
具體實(shí)施方式
下面結(jié)合具體實(shí)施方式對(duì)本發(fā)明的技術(shù)方案作進(jìn)一步的介紹。
本發(fā)明公開(kāi)了一種防爬蟲(chóng)的方法,包括以下步驟:
S1:對(duì)接收到的請(qǐng)求進(jìn)行判斷:
S1.1:判斷所述請(qǐng)求的ip是否為內(nèi)部ip:如果是,則直接進(jìn)行步驟S6;如果不是,則繼續(xù)步驟S1.2的判斷;
S1.2:用所述請(qǐng)求的ip作為密鑰,從MemCache緩存中查找有關(guān)所述ip的信息:如果查到相關(guān)信息,則檢查所述請(qǐng)求是否已被標(biāo)記為爬蟲(chóng),如果已被標(biāo)記為爬蟲(chóng),則進(jìn)行步驟S5,如果沒(méi)有被標(biāo)記為爬蟲(chóng),則進(jìn)行步驟S2;如果沒(méi)有查到相關(guān)信息,則插入一條新記錄,并進(jìn)行步驟S2;
S2:對(duì)第一預(yù)設(shè)時(shí)間內(nèi)的請(qǐng)求總數(shù)進(jìn)行檢驗(yàn);
S3:對(duì)第二預(yù)設(shè)時(shí)間內(nèi)的子請(qǐng)求和父請(qǐng)求次數(shù)比例進(jìn)行檢驗(yàn);
S4:判斷步驟S2和S3的兩次檢驗(yàn)是否均通過(guò):如果均通過(guò),則進(jìn)行步驟S6;否則,判斷進(jìn)行步驟S5;
S5:攔截所述請(qǐng)求,并返回步驟S1進(jìn)行繼續(xù)判斷;
S6:允許所述請(qǐng)求,并返回步驟S1進(jìn)行繼續(xù)判斷。
圖1給出了采用本發(fā)明方法對(duì)一次請(qǐng)求進(jìn)行處理的流程。
下面以酒店網(wǎng)站為例,介紹一下本發(fā)明的技術(shù)方案:
當(dāng)酒店列表頁(yè)接口接收到請(qǐng)求的時(shí)候,會(huì)執(zhí)行如下的方法:
S1:對(duì)接收到的請(qǐng)求進(jìn)行判斷:
S1.1:如果請(qǐng)求對(duì)應(yīng)的ip為內(nèi)部ip,則直接進(jìn)行步驟S6;如果不是,則繼續(xù)步驟S1.2的判斷;
S1.2:用請(qǐng)求對(duì)應(yīng)的ip作為密鑰,從MemCache緩存中查找有關(guān)所述ip的信息:如果查到相關(guān)信息,則檢查所述請(qǐng)求是否已被標(biāo)記為爬蟲(chóng),如果已被標(biāo)記為爬蟲(chóng),則進(jìn)行步驟S5,如果沒(méi)有被標(biāo)記為爬蟲(chóng),則進(jìn)行步驟S2;如果沒(méi)有查到相關(guān)信息,則插入一條新記錄,并進(jìn)行步驟S2;
其中,MemCache緩存中記錄的信息有:
1)Timestamp:1分鐘計(jì)時(shí)(初始化為當(dāng)前時(shí)間);
2)Count:1分鐘之內(nèi)父請(qǐng)求總次數(shù)(初始化為1);
3)Timestamp2:5分鐘計(jì)時(shí)(初始化為當(dāng)前時(shí)間);
4)Count2:5分鐘之內(nèi)父請(qǐng)求總次數(shù)(初始化為1);
5)SonCount:5分鐘之內(nèi)子請(qǐng)求總次數(shù)(初始化為0);
6)Isrobot:是否是爬蟲(chóng)(初始化為false);
S2:進(jìn)行1分鐘訪問(wèn)頻次的檢查:取第一預(yù)設(shè)時(shí)間為1分鐘:計(jì)算本次1分鐘檢查的開(kāi)始時(shí)間Timestamp與當(dāng)前時(shí)間time的差值TimeDiff,如果TimeDiff小于30秒,則令TimeDiff等于30秒,因?yàn)?0秒內(nèi)計(jì)算頻次沒(méi)有意義;如果TimeDiff小于60秒并且該段時(shí)間內(nèi)的請(qǐng)求總數(shù)小于15,則認(rèn)為該請(qǐng)求合法,Count數(shù)加1;
然后用新的Count除以TimeDiff得出當(dāng)前1分鐘的訪問(wèn)頻次,如果大于預(yù)設(shè)值,則認(rèn)為1分鐘檢查不通過(guò),設(shè)定1分鐘檢查的標(biāo)記符flag1為false,否則,flag1設(shè)為true;
S3:取第二預(yù)設(shè)時(shí)間為5分鐘:計(jì)算本次5分鐘檢查的開(kāi)始時(shí)間Timestamp2與當(dāng)前時(shí)間time的差值TimeDiff2,將本次5分鐘內(nèi)的請(qǐng)求總數(shù)Count2加1,用SonCount除以新的Count2得出當(dāng)前5分鐘內(nèi)子請(qǐng)求和父請(qǐng)求的訪問(wèn)次數(shù)比:如果TimeDiff2小于5分鐘或者子請(qǐng)求與父請(qǐng)求的訪問(wèn)次數(shù)比大于設(shè)定的閥值,則認(rèn)為本次5分鐘檢查通過(guò),設(shè)定5分鐘檢查的標(biāo)記符flag2為true;否則,flag2設(shè)為false;
S4:判斷步驟S2和S3的兩次檢驗(yàn)是否均通過(guò):如果均通過(guò),則更新MemCache里的記錄,然后進(jìn)行步驟S6;否則,再次檢查該ip是否在白名單內(nèi),如果在白名單內(nèi)則將Isrobot標(biāo)記為false,更新MemCache的記錄,然后進(jìn)行步驟S6,如果不在白名單內(nèi),則進(jìn)行步驟S5;
S5:攔截所述請(qǐng)求,并返回步驟S1進(jìn)行繼續(xù)判斷;
S6:允許所述請(qǐng)求,并返回步驟S1進(jìn)行繼續(xù)判斷。
步驟S2中,對(duì)第一預(yù)設(shè)時(shí)間內(nèi)的請(qǐng)求總數(shù)進(jìn)行檢驗(yàn)采用第一預(yù)設(shè)閥值來(lái)判斷是否通過(guò)檢驗(yàn),請(qǐng)求來(lái)自搜索引擎對(duì)應(yīng)的第一預(yù)設(shè)閥值大于請(qǐng)求來(lái)自其他用戶對(duì)應(yīng)的第一預(yù)設(shè)閥值;步驟S3中,對(duì)第二預(yù)設(shè)時(shí)間內(nèi)的子請(qǐng)求和父請(qǐng)求次數(shù)比例進(jìn)行檢驗(yàn)采用第二預(yù)設(shè)閥值來(lái)判斷是否通過(guò)檢驗(yàn),請(qǐng)求來(lái)自搜索引擎對(duì)應(yīng)的第二預(yù)設(shè)閥值大于請(qǐng)求來(lái)自其他用戶對(duì)應(yīng)的第二預(yù)設(shè)閥值。例如,步驟S2中,判斷請(qǐng)求是否來(lái)自搜索引擎,為搜索引擎的爬蟲(chóng)制定不一樣的閥值,比如普通用戶限制一分鐘最多訪問(wèn)100次,而搜索引擎一分鐘最多可以訪問(wèn)200次。
此外,還可以對(duì)MemCache緩存中的記錄設(shè)定自動(dòng)過(guò)期時(shí)間,超過(guò)自動(dòng)過(guò)期時(shí)間后,記錄被刪除。例如,設(shè)定自動(dòng)過(guò)期時(shí)間為4小時(shí),也就是說(shuō),如果本次請(qǐng)求間隔上次請(qǐng)求超過(guò)4小時(shí)的話,上次的記錄已被刪除,將要重新對(duì)這個(gè)ip進(jìn)行監(jiān)控。同樣的,如果ip被標(biāo)記為爬蟲(chóng),那么它在4個(gè)小時(shí)內(nèi)無(wú)法訪問(wèn)網(wǎng)站,一旦超過(guò)了4個(gè)小時(shí),該ip又變成合法的,可以繼續(xù)訪問(wèn)網(wǎng)站。這樣能夠防止錯(cuò)誤封掉了合法的ip。