本發(fā)明涉及一種基于web服務(wù)的非阻塞端信息跳變方法,尤其涉及在服務(wù)器運(yùn)行過程中,通過server.request()函數(shù)來為客戶端提供服務(wù),并通過調(diào)用select()函數(shù)確定在一定的服務(wù)響應(yīng)時間timeout內(nèi)是否有服務(wù)請求到來,之后把服務(wù)器收集到的退出的子進(jìn)程狀態(tài)作為判斷標(biāo)準(zhǔn)來執(zhí)行端信息跳變代碼,實(shí)現(xiàn)服務(wù)器的非阻塞端信息跳變。
背景技術(shù):
近年來,安全防范和網(wǎng)絡(luò)對抗技術(shù)日益引起重視,確定性、相似性、靜態(tài)性是現(xiàn)有web服務(wù)器設(shè)計(jì)的致命安全隱患,越來越多的web攻擊令設(shè)計(jì)者防不勝防。動態(tài)目標(biāo)防御作為一種新的主動網(wǎng)絡(luò)防御技術(shù)備受關(guān)注,其核心思想是通過構(gòu)建動態(tài)、異構(gòu)、不確定的信息系統(tǒng),增強(qiáng)其多樣性、偽隨機(jī)和不可預(yù)測性,增加攻擊者的攻擊難度。
端信息跳變技術(shù)作為動態(tài)目標(biāo)防御在網(wǎng)絡(luò)層實(shí)施的關(guān)鍵技術(shù)之一,指通信雙方或多方按照一定的協(xié)議,偽隨機(jī)的改變地址、端口、算法、服務(wù)等端信息,在保證正常通信的條件下,提升自身防御能力的一種主動網(wǎng)絡(luò)防護(hù)技術(shù)。將端信息跳變技術(shù)應(yīng)用于web服務(wù)開發(fā),不僅增加了web服務(wù)開發(fā)的多樣性、靈活性與便捷性,而且通過構(gòu)建動態(tài)、異構(gòu)、不確定的web服務(wù)端信息,可以有效破壞敵方攻擊干擾,實(shí)現(xiàn)主動網(wǎng)絡(luò)防護(hù)。
另一方面,在傳統(tǒng)的網(wǎng)絡(luò)編程中我們依賴于serversocket,socket進(jìn)行通信,大致的框架就是serversocket調(diào)用accept方法,等待客戶端的連接,如果連接進(jìn)來的時候則創(chuàng)建一個服務(wù)器端socket,客戶端和服務(wù)器端socket建立好inputstream和outputstream通道進(jìn)行通信,在這個網(wǎng)絡(luò)io的過程中inputstream的read和outputstream的write方法都可能發(fā)送阻塞。為了減少這種阻塞對其他連接的影響,一般都會在服務(wù)器端為每個連接開辟一個新的線程,或者使用線程池技術(shù)來避免線程的創(chuàng)建銷毀同時又一定程度支持并發(fā)量。然而這種情況下,如果發(fā)生大量的read或者write阻塞線程池的效率會大大降低,而且操作系統(tǒng)也額外需要頻繁的處理cpu的切換。
非阻塞式通信實(shí)際是對上述模式的擴(kuò)展,它的核心思想是為傳統(tǒng)的socket加入事件監(jiān)聽的功能,操作系統(tǒng)可以在socket和serversocket上進(jìn)行事件監(jiān)聽,一旦監(jiān)聽的對象發(fā)生了連接和可讀可寫的事件,監(jiān)聽器就會對注冊了事件的對象返回相應(yīng)的通知。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明為實(shí)現(xiàn)web服務(wù)的非阻塞端信息跳變,以serversocket為原型,將服務(wù)器的非阻塞技術(shù)應(yīng)用于端信息跳變,實(shí)現(xiàn)服務(wù)器地址、端口、算法等端信息的偽隨機(jī)跳變,以此增強(qiáng)服務(wù)器編寫的多樣性,提高服務(wù)器的自身防御能力。
為達(dá)到上述目的,提出的一種基于web服務(wù)的非阻塞端信息跳變方法,主要包括以下步驟:
a、針對web服務(wù)器,創(chuàng)建一個客戶端的socket請求處理類,檢測客戶端的連接請求;
b、實(shí)例化一個web服務(wù)器連接和請求處理類,對傳入服務(wù)器的地址和請求執(zhí)行監(jiān)聽與監(jiān)測;
c、對web服務(wù)器阻塞處理函數(shù)進(jìn)行重寫,自定義阻塞中斷處理時間timeout值;
d、調(diào)用select方法,檢測web服務(wù)器在執(zhí)行阻塞中斷處理之前是否有服務(wù)請求,以此實(shí)現(xiàn)web服務(wù)器的非阻塞;
e、根據(jù)是否有服務(wù)請求選擇不同的服務(wù)器操作,偽隨機(jī)的改變web服務(wù)的地址、端口、算法、服務(wù)等端信息,實(shí)現(xiàn)web服務(wù)器的端信息跳變。
2.根據(jù)權(quán)利要求1所述的一種基于web服務(wù)的非阻塞端信息跳變方法其特征在于:所述步驟c中,在此我們將serversocket庫函數(shù)中timeout自定義為阻塞中斷處理時間,為了實(shí)現(xiàn)服務(wù)器的非阻塞端信息跳變,我們需要修改該數(shù)值,數(shù)值大小按程序需求定義。
3.根據(jù)權(quán)利要求1和權(quán)利要求2所述的一種基于web服務(wù)的非阻塞端信息跳變方法其特征在于:所述步驟d中,我們根據(jù)在設(shè)定的阻塞中斷處理時間內(nèi)是否有服務(wù)請求進(jìn)行的到來判斷服務(wù)器的是否跳變,編寫的函數(shù)要求實(shí)現(xiàn)循環(huán)檢測對服務(wù)器子進(jìn)程狀態(tài)的功能,根據(jù)子進(jìn)程的狀態(tài)來測定是否有服務(wù)進(jìn)程到來,這樣實(shí)時的檢測就避免了web服務(wù)的阻塞。
4.根據(jù)權(quán)利要求1所述的一種基于web服務(wù)的非阻塞端信息跳變方法其特征在于:所述步驟e中,如果在上述步驟d中未檢測到服務(wù)請求進(jìn)程,原函數(shù)庫默認(rèn)服務(wù)器什么都不做,而我們在此添加我們的服務(wù)器跳變代碼,讓服務(wù)器運(yùn)行我們的跳變代碼,偽隨機(jī)的改變web服務(wù)的地址、端口、算法、服務(wù)等端信息,實(shí)現(xiàn)服務(wù)器的端信息跳變,增強(qiáng)web服務(wù)的健壯性;如果在上述步驟d中檢測到服務(wù)請求進(jìn)程,程序可以調(diào)用封裝好的request函數(shù)將步驟b中實(shí)例化過的服務(wù)器內(nèi)容返回給客戶端。這樣,我們就實(shí)現(xiàn)了服務(wù)器編程的非阻塞端信息跳變。
以上技術(shù)方案可以看出,在本發(fā)明中,較之現(xiàn)有的非阻塞web服務(wù)而言,將端信息跳變與非阻塞算法相結(jié)合,通過監(jiān)測web服務(wù)請求信息實(shí)現(xiàn)web服務(wù)器的可調(diào)控性,改變原有web服務(wù)器端信息的不可跳變性,從而為我們的服務(wù)器設(shè)計(jì)提供了新的方法,提高了我們服務(wù)器設(shè)計(jì)的便捷性。
此外,經(jīng)過端信息跳變之后的web服務(wù)由于信息的不確定性,無法定位到確定的web服務(wù)信息,這樣保證了web服務(wù)的可防御性,用于抵御web攻擊有很好的效果,在一定程度上提高了web服務(wù)的安全性。
附圖說明
為了更清楚的說明本發(fā)明實(shí)施例中的技術(shù)方案,下面結(jié)合附圖與具體實(shí)施方案對本發(fā)明做進(jìn)一步說明:
圖1為發(fā)明公開的常用的socket套接字連接過程;
圖2為發(fā)明公開的基于web服務(wù)的非阻塞端信息跳變方法流程圖。
具體實(shí)施方式
請參閱圖2,其為本發(fā)明基于web服務(wù)的非阻塞端信息跳變方法。
步驟a:針對web服務(wù)器,創(chuàng)建一個客戶端的socket請求處理類,檢測客戶端的連接請求。
所述步驟a的請求處理類即為socket套接字連接過程。如圖1,即為一個完整的socket套接字編程過程,它主要包括服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn),數(shù)據(jù)傳輸,關(guān)閉連接等步驟,套接字之間的連接過程即為該過程的前三個步驟。
服務(wù)器監(jiān)聽:服務(wù)端首先創(chuàng)建一個socket套接字,利用listen()函數(shù)來監(jiān)聽是否有socket請求到來。此時服務(wù)器處于等待連接的狀態(tài),實(shí)時監(jiān)控網(wǎng)絡(luò)狀態(tài)。
客戶端請求:客戶端創(chuàng)建一個socket套接字請求,并利用connect()函數(shù)與服務(wù)器進(jìn)行連接。此過程中,客戶端的socket套接字必須首先描述它要連接的服務(wù)器的socket套接字,確定服務(wù)器端套接字的ip地址和端口號,然后就向服務(wù)器端套接字提出連接請求。
連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。
步驟b:實(shí)例化一個web服務(wù)器連接和請求處理類,對傳入服務(wù)器的地址和請求執(zhí)行監(jiān)聽與監(jiān)測。
所述步驟b中,在實(shí)例化一個服務(wù)器類的過程中,利用socketserver函數(shù)庫函數(shù),將本機(jī)ip地址作為服務(wù)器的地址,綁定相關(guān)服務(wù)到本機(jī)。其中,socketserver有4個類:tcpserver,udpserver,unixstreamserver,unixdatagramserver。這4個類是同步進(jìn)行處理的,另外通過forkingmixin和threadingmixin類來支持異步。集成threadingmixin類時需要處理異常關(guān)閉。daemon_threads指示服務(wù)器是否要等待線程終止,要是線程互相獨(dú)立,必須要設(shè)置為true,默認(rèn)是false。
步驟c:對web服務(wù)器阻塞處理函數(shù)進(jìn)行重寫,自定義阻塞中斷處理時間timeout值。
所述步驟c中,在此我們將serversocket庫函數(shù)中timeout自定義為阻塞中斷處理時間,為了實(shí)現(xiàn)服務(wù)器的非阻塞端信息跳變,我們需要修改該數(shù)值,數(shù)值大小按程序需求定義。
步驟d:調(diào)用select方法,檢測web服務(wù)器在執(zhí)行阻塞中斷處理之前是否有服務(wù)請求,以此實(shí)現(xiàn)web服務(wù)器的非阻塞。
所述步驟d中,我們根據(jù)在設(shè)定的阻塞中斷處理時間內(nèi)是否有服務(wù)請求進(jìn)行的到來判斷服務(wù)器的是否跳變,編寫的函數(shù)要求實(shí)現(xiàn)循環(huán)檢測對服務(wù)器子進(jìn)程狀態(tài)的功能,根據(jù)子進(jìn)程的狀態(tài)來測定是否有服務(wù)進(jìn)程到來,這樣實(shí)時的檢測就避免了web服務(wù)的阻塞。
下面以unix下的python為例,假定我們設(shè)定的timeout值為0.5,即服務(wù)器運(yùn)行0.5s后檢測該0.5s內(nèi)是否有客戶端的服務(wù)請求。select方法是進(jìn)程指定內(nèi)核監(jiān)聽哪些文件描述符的哪些事件,當(dāng)沒有文件描述符事件發(fā)生時,進(jìn)程被阻塞;當(dāng)一個或者多個文件描述符事件發(fā)生時,進(jìn)程被喚醒。它的文件描述符為:
fd_r_list,fd_w_list,fd_e_list=select.select(rlist,wlist,xlist,[timeout])
參數(shù):可接受四個參數(shù)(前三個必須)
rlist:waituntilreadyforreading;wlist:waituntilreadyforwriting;xlist:waitforan“exceptionalcondition”;timeout:超時時間。
返回值:三個列表
select方法用來監(jiān)視文件描述符(當(dāng)文件描述符條件不滿足時,select會阻塞),當(dāng)某個文件描述符狀態(tài)改變后,會返回三個列表。
當(dāng)參數(shù)1序列中的fd滿足“可讀”條件時,則獲取發(fā)生變化的fd并添加到fd_r_list中;當(dāng)參數(shù)2序列中含有fd時,則將該序列中所有的fd添加到fd_w_list中;當(dāng)參數(shù)3序列中的fd發(fā)生錯誤時,則將該發(fā)生錯誤的fd添加到fd_e_list中;當(dāng)超時時間為空,則select會一直阻塞,直到監(jiān)聽的句柄發(fā)生變化;當(dāng)超時時間=n(正整數(shù))時,那么如果監(jiān)聽的句柄均無任何變化,則select會阻塞n秒,之后返回三個空列表,如果監(jiān)聽的句柄有變化,則直接執(zhí)行。
調(diào)用select方法,根據(jù)返回的三個列表的狀態(tài)來檢測是否有客戶端的請求,這樣就可以實(shí)現(xiàn)服務(wù)器的非阻塞。
步驟e:根據(jù)是否有服務(wù)請求選擇不同的服務(wù)器操作,偽隨機(jī)的改變web服務(wù)的地址、端口、算法、服務(wù)等端信息,實(shí)現(xiàn)web服務(wù)器的端信息跳變。
所述步驟e中,如果在上述步驟d中未檢測到服務(wù)請求進(jìn)程,原函數(shù)庫默認(rèn)服務(wù)器什么都不做,而我們在此添加我們的服務(wù)器跳變代碼,讓服務(wù)器運(yùn)行我們的跳變代碼,偽隨機(jī)的改變web服務(wù)的地址、端口、算法、服務(wù)等端信息,實(shí)現(xiàn)服務(wù)器的端信息跳變,增強(qiáng)web服務(wù)的健壯性;如果在上述步驟d中檢測到服務(wù)請求進(jìn)程,程序可以調(diào)用封裝好的request函數(shù)將步驟b中實(shí)例化過的服務(wù)器內(nèi)容返回給客戶端。這樣,我們就實(shí)現(xiàn)了服務(wù)器編程的非阻塞端信息跳變。
如圖2所示為完整的基于web服務(wù)的非阻塞端信息跳變方法流程圖。它很好的闡述了該方法的設(shè)計(jì)過程,它將非阻塞的方法跟端信息跳變相結(jié)合,可以有效的預(yù)防外部網(wǎng)絡(luò)的攻擊,為我們的網(wǎng)絡(luò)服務(wù)提供更高的安全性。其中端信息跳變包括ip地址跳變,端口跳變,加密算法的跳變等,是一種很好的防御方法,既有良好的服務(wù)性,又有較高的安全性。
以上將基于web服務(wù)的非阻塞端信息跳變方法基本步驟進(jìn)行了詳細(xì)描述。在此方案下的非阻塞跳變服務(wù)器設(shè)計(jì)方法,通過將非阻塞socketserver與端信息跳變相結(jié)合,旨在實(shí)現(xiàn)web服務(wù)的非阻塞端信息跳變,從而實(shí)現(xiàn)web服務(wù)設(shè)計(jì)的多樣性。經(jīng)過端信息跳變之后的web服務(wù)由于信息的不確定性,無法定位到確定的web服務(wù)信息,這樣保證了web服務(wù)的可防御性,用于抵御web攻擊有很好的效果,在一定程度上提高了web服務(wù)的安全性。