網站即時監控系統的設計與實現

來源:互聯網
上載者:User
監控|設計 摘 要: 本文提出了基於作業系統核心服務和多線程技術的網站即時監控系統,解決了以往監控系統不能及時恢複異常網頁的問題。重點介紹了系統的傳送控制部分和監控部分

   關鍵詞: 即時監控;多線程;API

   引言

  對網頁監控比較成熟的技術是定時監控,即由使用者設定時間間隔,系統按時對需監控的網頁檔案輪詢一遍,來判斷檔案是否被非法刪除或篡改。若發現,立即用備份盤上的備份檔案進行恢複。這樣的監控存在一個缺陷:被非法刪除或篡改的網頁不能得到及時的恢複。

  本文介紹的網站即時監控系統創造性地利用作業系統核心提供的系統服務和多線程技術,所有的檔案非法變更事件都會被作業系統及時通知監控程式,該機制完全區別於掃描技術,不需要與備份庫對比分析的繁瑣過程,可以做到監控的即時性和低耗性。 2 系統工作原理

  為了實現網站的即時自動回復,系統需要由三個部分組成:網站監控,網站備份,傳送控制。網站監控負責監視Web伺服器內部的變化,發現對網頁檔案的非法篡改;網站備份是Web伺服器內網頁檔案系統的映像,以及有關資料庫系統;傳送控制對網站監控部分實施控制並用於頁面維護工作,而且還負責產生有關審計記錄,警示資訊等。這三個部分組成一個有機整體,工作原理如下:網站監控發現異常並分析出異常點,接著通知傳送控制部分;傳送控制部分控制網站備份部分將與異常點有關的正確內容傳送到Web伺服器覆蓋異常部分,同時產生相應的審計記錄和警示資訊。

   傳送控制部分

  使用本系統時,使用者首先通過定製監控目錄選擇要監控的網頁檔案。當進行即時監控時,系統啟動多個並發的監控線程對多個目錄實施即時監控,一個線程監控一個目錄。傳送控制部分負責啟動監控線程,接收監控線程傳來目錄變更的訊息,並根據訊息將備份檔案覆蓋異常檔案,產生警示和審計資訊。

  1、監控線程的啟動

  由於使用者定製的須監控網頁的個數是不固定的,因此所須監控的目錄的個數也是不固定的,所以要啟動的線程的數目也將是不固定的。鑒於此,我們用鏈表結構來表示所須監控的目錄。鏈表結構包括目錄名和指向下一個監控目錄結構的指標,結構為: struct list{

string dirname; //記錄目錄名稱的字串
struct list *next;} // 指向下一節點的指標
  如圖1所示


  圖1 三節點的鏈表
  鏈表的資料來源可以是靜態使用者設定檔或動態使用者操作選取。當鏈表中的一個節點指向下一節點的指標為NULL時,說明該節點是鏈表的末節點。根據鏈表,啟動多個線程,鏈表有一個節點,就代表有一個目錄需要監控,就需要啟動一個監控線程,遍曆整個鏈表,就可以根據使用者需求啟動所有線程,監控所有定製的目錄。實現過程如圖2所示。


  鏈表的初始地址àP

P=NULL?
CreateThread( NULL,0,monitor,P,0,&ThreadId )
P=PàNEXT
終止
Y
N
  圖2中P是指向鏈表中一個節點的指標,最初指向鏈表的首節點,每啟動一個線程,P向後移一個節點。P同時作為參數傳遞給線程的控制函數,控制函數通過指標P可以知道自己正在監控的是哪一個目錄。Windows系統函數CreateThread( NULL,0,monitor,P,0,&ThreadId )啟動監控線程,monitor是線程式控制制函數的起始地址。

  2、變更訊息的處理

  在傳送控制部分定義一個DealFun函數專門用於處理網站監控部分發送的目錄變更訊息。網站監控部分發送的變更訊息有三個參數:發生了什麼樣的改變,發生改變的檔案名稱和發生改變的檔案所在目錄。DealFun函數根據檔案名稱和目錄名到檔案備份資料庫中找到該檔案的備份檔案,並用備份檔案覆蓋該檔案;再根據改變的類型(比如檔案被刪除,檔案被修改等)產生相應的警示資訊。同時把每次變更寫入日誌資料庫中。

   網站監控部分

  網站監控部分負責實現監控線程中的控制函數,對指定的一個目錄進行監控,當該目錄中有檔案發生改變,負責把變更資訊發送給傳送控制部分。 Windows提供了對檔案和目錄監控的系統服務,並且為應用程式提供了兩個API函數,它們分別是:FindFirstChangeNotification和ReadDirectoryChangesW。由於通過FindFirstChangeNotification函數只能監控到某一目錄下有檔案發生改變,而不能監控到具體是哪一檔案發生改變,所以本系統選用ReadDirectoryChangesW函數。該函數的定義為:

BOOL ReadDirectoryChangesW(
HANDLE hDirectory,
LPVOID lpBuffer,
DWORD nBufferLength,
BOOL bWatchSubtree,
DWORD dwNotifyFilter,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
  第一個參數hDirectory是要監控目錄的控制代碼,可以通過指定目錄名,利用CreateFile函數的傳回值獲得。使用者代碼通過第二個和第三個參數來告知作業系統該把目錄變化通知放在首地址為lpBuffer, 長度為nBufferLength的一塊記憶體地區當中的。但是該記憶體又是怎樣組織的呢?作業系統是把他們放在FILE_NOTIFY_INFORMATION這個結構裡面的:

typedef struct _FILE_NOTIFY_INFORMATION {
DWORD NextEntryOffset;
DWORD Action;
DWORD FileNameLength;
WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
  這是一個鏈表結構,第一個欄位儲存了要獲得下一個記錄需要跳過多少位元組數,如果它的值為0,就表示本記錄已經是鏈表中的最後一條記錄了。該欄位其實也可以看作是一個指向下一條記錄的指標。第二個欄位的含義是:本次通知了哪種類型的目錄變化。第三個欄位表示的是變化的檔案名稱的長度。第四個欄位是一個存放變化的檔案名稱的Unicode字元數組的首地址。

  另外一個與本系統有關的參數是dwNotifyFilter。它是目錄變化通知過濾器。要監控檔案名稱發生變化,此參數應設為FILE_NOTIFY_CHANGE_FILE_NAME;檔案被非法改寫為FILE_NOTIFY_CHANGE_LAST_WRITE等等。根據過濾器的設定,ReadDirectoryChangesW函數可以監控檔案名稱改變、檔案屬性改變、檔案大小改變、檔案內容被改寫、檔案被刪除等多種類型的變化。

  監控線程的控制函數就是利用ReadDirectoryChangesW函數實現對一個目錄進行監控的。具體的做法是:首先使用CreateFile擷取要監控目錄的控制代碼;然後在一個While迴圈裡面調用ReadDirectoryChangesW,並且把自己分配的用來存放目錄變化通知的記憶體首地址、記憶體長度、目錄控制代碼傳給該函數。使用者代碼在該函數的調用中進行同步等待。當目錄中有檔案發生改變,控制函數把目錄變化通知存放在指定的記憶體地區內,並以訊息的方式把發生改變的檔案名稱、檔案所在目錄和改變的方式傳遞給傳送控制函數。具體代碼如下:

static DWORD WINAPI monitor( list lParam ) //入口參數為3.1節中描述的鏈表指標
{ HANDLE hdir;
hDir = CreateFile(
lParamà.c_str(),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
); //擷取要監控目錄的控制代碼。目錄名稱由入口參數指定

if( INVALID_HANDLE_VALUE == hDir ) return false;
char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf; //指定存放目錄變化通知的記憶體地區
DWORD BytesReturned;
while(true) //進入迴圈監控
{ if( ReadDirectoryChangesW(hDir,
pNotify,
sizeof(buf),
true, //監控子目錄
//設定過濾器
FILE_NOTIFY_CHANGE_FILE_NAME|
FILE_NOTIFY_CHANGE_DIR_NAME|
FILE_NOTIFY_CHANGE_ATTRIBUTES|
FILE_NOTIFY_CHANGE_SIZE|
FILE_NOTIFY_CHANGE_LAST_WRITE|
FILE_NOTIFY_CHANGE_LAST_ACCESS|
FILE_NOTIFY_CHANGE_CREATION|
FILE_NOTIFY_CHANGE_SECURITY,
&BytesReturned,
NULL,
NULL ) )
{ if( 0 != pNotify->NextEntryOffset )
{ PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
}

MonitorControl obj;//傳送控制類,在傳送控制部分中定義
objàDealFun( (ACTION)pNotify->Action, pNotifyàFileName,lParamàdirname );//將目錄改變通知以訊息的方式傳遞給傳送控制部分
}

else
{break;
}
}
return 0;
}
  系統的模型用UML的活動圖表方式表示如圖3所示:


圖3 系統模型
   結論

  本文針對傳統的網站監控系統不能及時恢複非法刪除和篡改的網頁的問題,設計並實現了基於作業系統核心提供的服務和多線程技術網站即時監控系統。當非法篡改的事件發生時,本系統能夠毫秒級警示和自動回復,即使警示延遲和恢復相加,總和仍能夠保持在毫秒級,從根本上杜絕了駭客利用警示和恢複延遲發布非法資訊的可能。不足之處是本系統還只能在Windows作業系統下運行,我們正在研究能夠跨平台的網站即時監控系統。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。