对网页监控比较成熟的技术是定时监控,即由用户设定时间间隔,系统按时对需监控的网页文件轮询一遍,来判断文件是否被非法删除或篡改。若发现,立即用备份盘上的备份文件进行恢复。这样的监控存在一个缺陷:被非法删除或篡改的网页不能得到及时的恢复。

  本文介绍的网站实时监控系统创造性地利用操作系统内核提供的系统服务和多线程技术,所有的文件非法变更事件都会被操作系统及时通知监控程序,该机制完全区别于扫描技术,不需要与备份库对比分析的繁琐过程,可以做到监控的实时性和低耗性。 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操作系统下运行,我们正在研究能够跨平台的网站实时监控系统。

转帖于:http://www.qqread.com/web-special/x505104022.html

网站实时监控系统的设计与实现相关推荐

  1. 环境实时监控系统的设计(以物联网仓储为例)

    文章目录 前言 1.1. 全局定义 2. 主程序 2.1. 数据库操作 2.1.1数据库操作线程 2.2. 处理用户请求线程 2.3. 接收仓库信息线程 2.4. 共享内存刷新线程 2.5. 摄像头模 ...

  2. python实现实时监控_基于 Python 的交换机实时监控系统的设计与实现

    从高校校园网运维工作实际出发,论文提出了一种基于 Python 语言+SNMP协议的网络交换机监测系统设计思路与实现方法.整个系统系统采用B/S模式,基于轻量级的web开发框架web.py实现.后端采 ...

  3. 基于android的手机位置系统,基于Android和SIM900A模块的位置实时监控系统的设计与实现...

    Design and implementation of real-time location monitoring system based on Android and SIM900A modul ...

  4. 实时内核μC/OS-II下的网络监控系统的设计

    实时内核μC/OS-II下的网络监控系统的设计 [日期:2008-8-5] 来源:电子技术应用  作者:高长艳 郑喜凤 丁铁夫 [字体:大 中 小] <script src="http ...

  5. 浅谈Telegraf+InfluxDB+Grafana快速搭建简易实时监控系统

    监控从来都是一个很宽泛的问题,任何可能出问题的地方都需要加入监控.全量监控的确是监控的终极目标.在搭建一套监控系统前,需要结合实际的系统情况和发展趋势进行考量.在作者看来,一套监控系统应主要由数据采集 ...

  6. CAT ----分布式实时监控系统

    2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一. 在当今互联网时代,业务 ...

  7. 看大众点评如何通过实时监控系统CAT打造7*24服务

    为什么80%的码农都做不了架构师?>>>    看大众点评如何通过实时监控系统CAT打造7*24服务 2015-06-08  尤勇  高可用架构 https://github.com ...

  8. UPS远程监控系统的设计与实现

    本文介绍了在UPS现有设备的前提下,为了提高设备的可靠性以及设备监控管理的科学化和自动化,通过软件与硬件的设计,构建一个UPS设备远程监控系统的过程,并阐述了该系统的工作原理.应用效果和前景. 引   ...

  9. [导入]基于Web的B/S结构实时监控系统[转]

    文章编号:1009-0193(2002)01-0062-02 基于Web的B/S结构实时监控系统 尉学军,刘 跃 (贵州工业大学 电气工程学院,贵州 贵阳 550003) 摘 要:提出了怎样利用Web ...

  10. 2个相同的 stm32 can通讯不成功_一文读懂,基于 STM32 和 CAN 总线的温度监控系统的设计方法...

    1 系统总体方案概述 系统总体框图如图 1 所示,本系统采用主站+从站的结构,CAN 主站主要实现温度数据的存储以及 CAN 总线协议和串口协议之间的桥接,CAN 从站主要实现温度的采集.CAN 从站 ...

最新文章

  1. LNMP架构详解(1)——了解架构的基本信息
  2. 阿里云首席智联网科学家丁险峰:每个企业都将有LoRa
  3. 零基础学python这本书怎么样-看了这本基础教程的书籍你还担心你的python学不好吗?...
  4. 设计模式-Adapter模式
  5. Redis | 001能做什么?
  6. python pickle模块操作
  7. mysql router 8.0.11_MySQL Router8
  8. Spring Boot + JSP
  9. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
  10. Python学习笔记——条件分支和while循环
  11. gulp教程之gulp-autoprefixer
  12. 3Dslicer +VS2013编译介绍
  13. Bailian2766 最大子矩阵【最大子段和+DP】
  14. 深度学习入门必看的书和论文?有哪些必备的技能需学习?
  15. ubuntu查看默认python版本_更改Ubuntu默认python版本的两种方法python- Anaconda
  16. 让犀牛基于点云数据来完成逆向建模
  17. Android屏幕区域划分及尺寸获取
  18. 190502 Expressing Belief
  19. 高通+android笔记本电脑,高通推出骁龙850移动平台,专门用于打造Windows ACPC笔记本产品...
  20. XLORE2:大规模跨语言知识图谱构建与应用

热门文章

  1. 小程序与微信会员卡打通教程
  2. 第1章 PyTorch和神经网:1.1 PyTorch和神经网络
  3. 银河麒麟V10-sp1服务器操作系统桌面环境安装
  4. helm 错误 Error: INSTALLATION FAILED: must either provide a name or specify --generate-name
  5. Ubuntu设置Root用户开机启动
  6. 基因编辑技术在农业中的应用综述
  7. 键盘删除键长按只能删除一个字符,因为开启了键盘筛选键功能,解决方法
  8. CSS —— 选择器
  9. 安全防御(四)--- 恶意软件及其特征、分类、免杀技术,反病毒技术,反病毒网关工作过程及其配置
  10. 计算机图形学入门(十三)-光线追踪(基本原理)