时间:2024-12-22
何诗佳,刘晓强,李柏岩,蔡立志,胡 芸
(1.东华大学计算机科学与技术学院,上海 201620)(2.上海市计算机软件评测重点实验室,上海 201112)
网站是团体和机构必不可少的信息发布和交流平台,易成为黑客攻击的对象. 黑客攻击网站时篡改网站内容,篡改后的页面往往会出现一些不良信息,对机构形象和社会安定产生负面影响. 网站变更监测的目标是对网站页面内容进行对比监测,实时报告变更情况,便于监控人员及时发现页面中的篡改内容,减少网站篡改带来的损失,维护网站安全.
网站变更监测存在着许多问题和难点. 实验表明,网站变化的频率与域名种类、页面大小等因素密切相关,大约有40%的网站在一周内发生了变化,大约50天内一半的网站都发生了变化,尤其是.com网站,一天内就有25%的网站发生了变化[1]. 网络中的网站数量庞大以及时刻动态变化的特性,使得对网站变化的监测十分困难. 同时,为了监测网站变化,反复重载所监测的页面进行比较,对系统的并行性要求很高. 基于目前网站变更监测的难点,本文设计和实现了一种基于非关系型数据库和消息机制的网站变更监测方案,可满足大规模实时监测需求. 在变更监测算法上采用MD5值比较与基于文本比较算法的结合,检测精度高,能够定位到变更的具体位置. 此外,系统增加了监测预警功能,可实现监测实时处理告警及紧急切断服务支持.
网站变更监测的方案主要分为两类:基于网站服务端的本地监测和基于客户端的远程监测.
基于网站服务端的本地监测主要采用事件触发技术、核心内嵌技术、外挂轮询技术等方法,其优点是可实时防护、技术精度高,但需在每个服务器上安装专门的软件,占用了服务器的系统资源,管理员操作复杂,不适合大规模的监测[2].
基于客户端的远程监测只需知道网站的域名,适合大规模多网站的实时监测服务. 远程监测网站变更主要采用以下算法:
(1)基于HTTP协议头的状态监测
基于HTTP协议头的状态监测常用属性有Last-Modified和ETag. Last-Modified中记录了网页在服务器端最后被修改的时间,ETag中记录了服务器根据网页资源所生成的标记号[3]. 服务器通过验证Last-Modified字段和ETag值即可判断网页内容是否发生变化. 该方法快速简单,可节省大量不必要的网络资源,适用于静态网页变更监测. 对于动态网页,Last-Modifed对应服务器发送Response的时间并非网页的最后更新时间,ETag通常为空值,该方法无效.
(2)基于网页的MD5值监测
MD5算法即Message-Digest Algorithm 5(信息-摘要算法5),监测时通过比较前后网页的MD5值来判断页面内容是否发生变更. 该方法实现简单,但过于严格,如页面中存在统计访问人数或记录时间的脚本,一旦发生变化,也会导致MD5值的改变,而这些改变通常无意义. 此外,该方法无法定位到发生变更的具体位置.
(3)基于文本比较算法的对比监测
网页本质上是纯文本文件,可将网页看成一个长字符串,通过文本比较算法来监测两个网页之间的差异. 文本比较算法主要有基于文本的编辑距离(levenshtein distance,LD)算法和基于文本的最长公共子序列(longest common subsequence,LCS)算法. 基于文本比较的对比算法实现简单、检测速度快,但直接使用文本比较算法来计算网页间的字符差异效率非常低.
(4)基于网页结构的对比监测
基于网页结构的对比监测是指根据网页代码生成一棵DOM树,采用遍历和树节点一一比对的方法来定位网页间的差异[4]. 其优点是能够全面比对网页的内容、结构、样式,适合只关注网页某个部分的监测,允许用户定制. 该方法不适合结构复杂的页面,会导致DOM树庞大,从而效率低、准确性低.
本文基于客户端的远程监测系统,将MD5值比较与基于文本比较算法结合以实现网站变更监测,该方法实现简单,检测精度高,能够定位到变更的具体位置. 由于传统关系型数据库不能满足对大量网站内容的快速查找,本系统采用非关系型分布式数据库ElasticSearch存储网页内容和变更结果[5],并采用高性能、易部署的NSQ消息队列实时处理不断新增的数据[6].
本文设计的网站变更监测预警系统以B/S架构为核心,有3个核心模块,整体架构如图1所示.
图1 网站变更监测预警系统架构Fig.1 The architecture of website change monitoring and early warning system
监测管理模块以Web网站形式向管理员提供对目标网站的监测和管理服务,包括监测任务管理、监测结果查看和监测报表生成. 用户通过该模块可以添加监测网站、开启或停止监测任务,使用MySQL数据库存储用户信息及相关任务信息,从ElasticSearch数据库中取出最终的监测结果可视化展示在页面上并生成对应的报表便于管理员查看,管理员可针对异常情况发出关闭服务器命令.
任务调度模块负责对监测任务模块进行配置并初始化NSQ消息队列. NSQ消息队列可用于大规模系统中的实时消息服务. 当任务调度获取到网站监测任务开启或关闭的信息后,能够对任务的状态进行更新,通过NSQ消息队列将任务信息分发到监测任务模块,启动对应的爬虫任务或变更监测分析任务.
监测任务模块分为网页爬取和变更分析两类. 监测任务开启后,爬虫定时去爬取被监测网站的网页信息并存储到ElasticSearch数据库中;变更监测分析任务通过对比前后两版页面信息将变更结果存入ElasticSearch数据库中,为最后以网页形式为用户呈现监测结果提供动态数据支持.
网站变更监测预警系统采用构件化技术,各模块独立运行,根据系统负载情况及用户需求适当开启监控任务,增强系统的稳定性与生命周期. 根据网站的变化判断是否正常,定义预警策略进行消息告警,并支持服务切断.
系统实现中,任务调度模块的任务调度器和监测任务模块的爬虫采用Golang语言开发;监测管理模块和监测任务模块的变更分析采用Python语言开发;网站Web端基于Django框架;采用非关系型数据库ElasticSearch存储网页内容和变更分析结果,其他信息存储在MySQL数据库中.
用户通过监测任务管理模块开启监测任务后,经任务调度器发送任务信息给NSQ消息队列,爬虫任务启动后监听NSQ中的任务信息进行页面爬取,爬取到的页面内容存储在ElasticSearch数据库中. 对同一URL的网页,每次爬取页面时会生成对应的版本号,进行对比分析时可根据爬虫版本号每次从ElasticSearch数据库中取出当前URL所对应版本的内容与上一版本进行变更对比,对比结果存入ElasticSearch数据库中.
网站变更分析采用MD5值进行初步比较,而后结合LCS算法进行文本内容比较.
3.2.1 采用MD5算法进行初步比较
一旦网页的MD5值发生变化,则网站的内容一定发生了变化. 本系统采用Python的hashlib库返回页面的MD5值进行比较. 若MD5一致,则表明页面内容未发生变化,不再进行下一步比较.
3.2.2 采用LCS算法进行文本内容比较
当对比页面MD5值不同时,采用LCS算法进行内容变更比较. LCS算法中的子序列指不改变序列中元素的顺序,从序列中删除任意某些元素而获得的新序列,例如字符串acdfg与akdfc的最长公共子序列为adf. 对于LCS问题的解决思路采用动态规划的方法.
《算法导论》第3版中通过构建矩阵实现该算法的求解[7]. 设所给的两个序列为X=和Y=. 由算法LCS计算出的结果Z为 ,求解过程如图2所示.
图2 LCS问题求解矩阵Fig.2 Sovling matrix of LCS
本文定义二维数组c[i][j]表示Xi和Yj的LCS的长度,b[i][j]中存放每次获得的解的方向. 算法的核心思想如下:
1Len1=序列X的长度
2Len2=序列Y的长度
3 Fori=0 toLen1
4c[i][0]==0
5 Forj=0 toLen2
6c[0][j]==0
7 Fori=1 toLen1
8 Forj=1 toLen2
9 IfX[i]==Y[j]
10c[i][j]==c[i-1][j-1] + 1
11b[i][j]==1 // 1表示箭头方向为 ↖
12 Else Ifc[i-1][j] >=c[i][j-1]
13c[i][j]==c[i-1][j]
14b[i][j]==2 // 2表示箭头方向为 ↑
15 Else
16c[i][j]==c[i][j-1]
17b[i][j]==3 // 3表示箭头方向为 ←
18Returnb,c
当得到完整的矩阵之后,通过倒推来得到相应的子序列. 从最后一个位置开始往前遍历b数组(i,j代表当前字符在数组中的位置):
若b[i][j]==1,则代表该字符是LCS的一员,存下该值后i-1,j-1,继续向左上角查找;
若b[i][j]==2,则代表该字符不是LCS的一员,i-1,向上查找;
若b[i][j]==3,也代表该字符不是LCS的一员,j-1,向左查找.
在代码实现时,每次回溯根据矩阵箭头标示生成初步的对比坐标点,在合并对比结果时通过坐标位置判断内容为新增、删除或更改.
LCS算法的时间复杂度和空间复杂度与进行比较的字符串长度成正比. 为了减少时间和空间耗费,本系统做出以下改进:
(1)在处理页面时,将页面以html标签“< >”切分为单位进行比较;
(2)使用碎块化对比,比对时若同一位置处两段切分完全相同,用一维数组记录下当前位标,并将位标增加100继续查找,否则位标加1;按照数组中记录的下标对比较对象进行碎块化,分别进行LCS算法处理,与比较对象相同度越高时,对比速度越快.
通过网站变更算法处理,对爬虫后的网页源码进行标记,标记分为变更标记和类型标记. 以html标签为一个切分,监测到增加部分在切分代码前添加变更标记“+”,减少部分添加变更标记“-”,改变部分添加变更标记“?”,未变部分添加变更标记“=”. 通过html标签判断变更类型,若改变部分为图片,则添加类型标记“I”;若改变部分为文本内容,则添加类型标记“T”,其他类型标记为“N”. 处理后的网页代码存储在ElasticSearch数据库中.
变更结果以网页形式实时展示,便于监控人员更直观地操作. 读取数据库中变更后的源码,根据标记加入相应的span标签,通过标签引入对应的CSS样式,最终展示在页面中.
图3所示为东华大学研究生系统任务中在7月内产生变更的网站及变更的具体信息. 记录显示了对应网站变更状态是否正常、变动范围、变更是否可见及变更各项的统计.
图3 变更统计详情页面Fig.3 Page of change statistics
如图4所示,点击查看详情按钮,即可查看到页面中具体内容的变化位置,并可通过高亮颜色来增强可视化效果.
图4 变更结果展示页面Fig.4 Page of change result
如图5所示,对CSS、Javascript的改变不直接显示在页面上,管理员可通过系统中的代码对比功能来判断变化是否正常.
系统采用设置变更率阈值来判断变更是否正常. 变更率阈值为增加、删除、变化的内容占整个网页的比重. 如图6所示,系统默认设计了二级告警,当阈值小于等于0.3时,定义为普通消息,普通信息显示在系统主页中进行提示(图6(a));当阈值大于0.3时,变更异常,定义为告警消息,系统会向客户单位发送邮件进行告警(图6(b)). 用户可通过定义变更率阈值来定义预警策略. 若管理员通过系统发现网站存在恶意变更内容,可紧急切断服务,待网站正常时恢复访问.
图6 预警消息Fig.6 Warning message
网站易成为黑客攻击的对象,对网站变更的监测往往能够减少网站被篡改所带来的不良影响. 本文所设计系统实现了对网站变更情况的实时监测与预警,并支持对多网站的大规模监测需求,为网站内容安全监控提供了一种基础架构和解决方案.
目前,系统中还存在以下问题需要进一步研究和改进:
(1)对于LCS算法,由于回溯时左侧值等于上方值时默认向上回溯,最终只能得到一种结果,而实际上通过LCS算法回溯路径不同可获得多种结果. 在所有结果中,如何找出最符合网站变更情况的结果是下一步需要研究的方向;
(2)系统对CSS和Javascript的变更只能通过管理员代码对比来判断,而CSS和Javascript的改变往往会给网站带来巨大的影响,因此在CSS和Javascript的监测上还需要进行优化.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!