当前位置:首页 期刊杂志

基于多模态的网站监测系统设计与实现

时间:2024-05-04

冯宝龙 高飞

摘要:网络信息安全工作中,网站监测通常注重两个方面:网站是否可以正常访问和网站是否被篡改。系统通过爬虫和自动化测试技术获取关键文本内容及页面截图,并分别进行分析,利用Python语言实现了基于多模态的网站动态监测,在实际工作中取得了一定的效果。

关键词:信息安全;多模态;网站监测;爬虫;Python

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2022)13-0028-03

1 开发背景

当前,高校中越来越多的业务网站上线运行。同时,传统的学校主站及各院系部处的网站,在对外宣传、展示学校形象等方面也起到越来越重要的作用[1]。

与此同时,高校网站业务系统由于其特殊性也成为黑客攻击的重要目标之一,因此如何能够自动化地监测不断增加的网站业务系统的运行状态及其内容安全,成为高校网络信息安全维护工作中迫切需要解决的问题。

针对以上问题,笔者结合实际工作需要,设计并实现了一个基于关键文本内容对比和页面截图对比的多模态网站动态监测系统。

2 总体设计

系统首先读取需要监测的网站、业务系统(以下简称网站)的地址。获取网站地址信息后,对网站的可访问性进行判断,若网站无法访问,发送告警信息到指定邮箱。若网站可以访问,继续获取网站页面的关键文本内容信息,与上一次获取的关键文本内容信息进行比对,若发现变化,发送告警邮件到指定邮箱。关键文本内容信息比对完毕,再对当前访问地址页面进行截图,同时与上一次获取的截图进行比对,若发现变化,将截图中变化的部分标注后,发送告警邮件到指定邮箱。

系统可根据用户设定的时间间隔,重复上面的业务流程,实现对网站页面的自动化监测告警。

3 关键功能实现

3.1 网站地址的获取

网站地址管理可以通过两种方式:1)通过MySQL数据库;2)通过CSV格式文件。

MySQL数据库是主流的关系型数据库,其社区版开源免费具有体积小、速度快、总体拥有成本低的特点,是中小企业和网站的首选[2]。通过MySQL数据库管理数据不仅可以满足当前功能需求,也可以满足后期其他扩展功能的实现。数据库共一张表,用来存储网站地址和备注信息。

Python连接MySQL数据库需要安装PyMySQL包进行驱动,再通过Pandas包进行具体的读取操作。PyMySQL是实现Python访问MySQL数据库的一个最方便快捷的方法[3],Pandas是一个用于数据分析的开源Python库,提供了数据快速加载、操作、合并等功能[4]。系统将相关函数进行了二次封装,封装后的函数代码如下:

def data_fromsql(strsql,dbname,host,user,passwd):

conn = pymysql.connect(host=host, user=user, passwd=passwd, db=dbname)

strsql = strsql

df = pd.read_sql(strsql, conn)

conn.close()

return df

函数调用时需要对相应的参数变量进行赋值:strsql对应执行查询的sql语句;dbname对应要访问的数据库名字;host对应数据库所在服务器地址;user对应访问数据库的用户名;passwd对应访问数据库用户的密码,函数执行成功返回DataFrame类型数据。

CSV格式文件是逗号分隔值格式文件,它是一种通用的、相对简单的文件格式,被广泛应用,该格式文件以纯文本形式存储表格数据,每行一条记录,每条记录用分隔符分割字段。一般以逗号作为分隔符,首行为字段标题。用CSV格式文件管理网站地址既满足了当前功能需求,也免去了安装MySQL数据库,方便不熟悉数据库的用户使用。

CSV文件数据的读取如下,同样获得DataFrame类型数据。

df = pd.read_csv(fname)

3.2 网站是否可以访问的判断

客户端向服务器端发送HTTP请求后,服务器端会返回HTTP响应报文,其中状态行部分包含状态码,当状态码返回值是200的时候,说明HTTP请求成功,网站可以正常访问,否则说明网站无法正常访问。核心代码如下:

r=requests.get(webindex,timeout=2) #webindex为需要监测的网站地址

res_str = str(r.status_code)       #res_str为返回的状态码

3.3 关键文本内容信息的获取与对比

对于网站文本内容的恶意篡改一般包括添加js脚本、修改a链接地址及内容、添加隐藏iframe、修改添加图片地址、修改meta和title相关信息。网络爬虫技术的发展,为获取网站中这些特定字段信息提供了技术支撑[5]。系统通过网络爬虫程序自动提取网站中关键文本内容信息进行持久化保存,每次保存后与前一次保存的数据做差集运算进行对比,发现新增内容就发送告警邮件,每次比对完成删除前一次保存的数据。核心代码如下:

#获取html数据:

html = BeautifulSoup(web_txt, "html.parser")

#從html数据获取title

title_set = set()

for x in html.find_all('title'):

title_one = x.get_text()

title_set.add(title_one)

#从html数据获取meta中的content:

meta_set = set()

for x in html.find_all('meta'):

meta_one = x.get("content")

meta_set.add(meta_one)

#从html数据获取a标签内容以及a标签中href数据

atxt_set = set()

alink_set = set()

for x in html.find_all('a'):

atxt_one_set=set(x.get_text().replace(" ","").split("\n"))

atxt_set=atxt_set | atxt_one_set

alink_one = x.get("href")

alink_set.add(alink_one)

#关键文本内容信息的持久化保存:

joblib.dump(content,f_name)    #数据的保存

t_start = joblib.load(f_start) #数据的读取

#关键文本内容信息差集运算:

t_diff= t_end-t_start

3.4 网站页面截图与相似度计算

另外一种常见的恶意篡改是对原站正常显示的图片进行修改,添加恶意文字后上传替换原图片,这种恶意篡改通常影响恶劣,修改方式隐秘,不能通过前面关键文本内容信息的比对发现,而图像对比技术恰恰可以解决这一问题。系统通过Python调用selenium自动化测试框架,对整个页面进行截图保存,然后通过图像对比技术计算前后两次页面截图的结构相似性度[6],当计算的结果低于设定的阈值时,说明图像有了较大的变化,立即发送告警邮件到指定邮箱。核心代码如下:

#页面截图相关

#chrome相关设置

chromedriver = r"driver/chromedriver"

os.environ["webdriver.chrome.driver"] = chromedriver

chrome_options = Options()

chrome_options.add_argument('--headless')

chrome_options.add_argument('--no-sandbox')

chrome_options.add_argument('disable-dev-shm-usage')

chrome_options.add_argument('lang=zh_CN.UTF-8')

chrome_options.add_argument('Accept-Language=zh-CN,zh;q=0.9,en;q=0.8')

driver = webdriver.Chrome(chromedriver, chrome_options=chrome_options)

#访问页面

driver.get(url)

#设置截图宽高

width = driver.execute_script("return document.documentElement.scrollWidth")

height = driver.execute_script("return document.documentElement.scrollHeight")

driver.set_window_size(width, height)

#截图保存

driver.save_screenshot('pic/' + f_name)

#图像比较相关

#将图像灰度化处理后计算结构相似度:

grayA = cv2.cvtColor(imgA, cv2.COLOR_BGR2GRAY)

grayB = cv2.cvtColor(imgB, cv2.COLOR_BGR2GRAY)

(diff_score, diff) = compare_ssim(grayA, grayB, full=True)

#根據图像变化,在新的截图上框出图像变化的位置:

diff = (diff * 255).astype("uint8")

thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cnts = imutils.grab_contours(cnts)

for c in cnts:

(x, y, w, h) = cv2.boundingRect(c)

cv2.rectangle(imgB, (x, y), (x + w, y + h), (0, 0, 255), 2)

3.5 告警邮件的创建与发送

当今主流的邮件系统都已经通过绑定微信或者安装单独的客户端等方式,实现了在邮箱收到邮件时,第一时间通知用户有新邮件到达的功能。系统通过向指定邮箱发送告警邮件,帮助用户实时监测网站,使用户在系统发现网站出现问题并发送告警信邮件后,能够及时收到告警邮件到达信息。对于网站无法正常访问、关键文本内容变化系统发送的邮件仅包含文字信息,而对于截图比对后的告警信息系统会附带变化后的标注图片作为附件发送告警邮件。告警邮件的发送通过Python提供的smtplib模块[7]实现,而告警邮件的创建需要通过Python提供的email模块[8]实现,创建及发送带附件的告警邮件核心代码如下:

#邮件创建

email = set_email()#提前设置好的邮件基础信息包括收件人,主题,发件人邮箱、密码,发送服务器等信息。

message = MIMEMultipart()#定义带附件的邮件

message.attach(MIMEText(email['to_mail_content'], 'plain', 'utf-8'))

attachment = MIMEApplication(open(fattach_path, 'rb').read())#读取附件文件

attachment.add_header('Content-Disposition', 'attachment',filename=fattach_path.split("/")[-1])

message.attach(attachment)

#發送邮件

smtpObj = smtplib.SMTP_SSL(from_mail_host,465)

smtpObj.login(from_mail_user,from_mail_pass) smtpObj.sendmail(from_mail_user,email['to_mail_user'],message.as_string())

4 系统运行效果

系统在东北农业大学实际环境中测试运行正常,发现无法正常访问网站若干,可以收到告警邮件,达到网站监测的目的。基于安全考虑,以下运行效果截图均针对测试站点用于演示。

5 结束语

系统使用Python3.6进行开发,实现了对网站基于文本和图像多模态进行动态监测的目标,易于部署,在实际应用中取得了一定的效果,具有一定的研究及推广价值。然而,系统也存在一定的不足,如发现网站内容变化后,如何进一步分析变化的内容将是系统下一步改进的方向。

参考文献:

[1] 夏中林.校园网网站监测系统的设计与实现[J].电脑知识与技术,2012,8(8):1842-1843,1856.

[2] 王飞飞,崔洋,贺亚茹.MySQL数据库应用从入门到精通[M].2版.北京:中国铁道出版社,2014.

[3] 李晓雨.利用python实现对存储在Mysql数据库的日志文件的分析和保存[J].科学技术创新,2021(29):94-96.

[4] 丹尼尔·陈.Python数据分析:活用Pandas库[M].武传海,译.北京:人民邮电出版社,2020.

[5] 江颖硕.关键目标网络信息自动获取技术研究[D].哈尔滨:哈尔滨工业大学,2021.

[6] 苗力元,李启明,刘雅东,等.图像比对技术在软件自动化测试中的应用探究[J].信息通信技术与政策,2019(11):79-84.

[7] 于长宇.基于Python实现的高校教务工作效能提升——以自动化群发邮件程序设计为例[J].科技创新与应用,2021,11(28):194-196.

[8] 黄美琼.基于Python定时批量发送邮件的实现[J].电脑编程技巧与维护,2022(1):51-52.

【通联编辑:谢媛媛】

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!