MySql二进制文件解析系统

MySql二进制日志文件解析系统


先看看最后的一个结果:

在这里插入图片描述

一、前期准备

1、前端框架

element-ui:Element-Ul是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是Mint UI 。

vue.js:是一套构建用户界面的渐进式框架, 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

axios.js: Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求。

<!-- import CSS -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <!--<script src="js/axios.js"></script>-->
  <script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
  <!-- import Vue before Element -->
  <script src="js/vue.js"></script>
  <!-- import JavaScript -->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>

2、后端框架

Flask框架

​ Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

​ Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。它被称为微框架,“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩展,Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或Web服务。

3、mysql二进制日志文件解析

​ 日志是数据库取证最重要的信息依据,MySQL 数据库的日志中记 录了用户对数据库数据所有的操作.本文通过研究 MySQL 数据存储原 理和日志功能原理,分析MySQL二进制日志结构,使用KMP算法对MySQL 二进制日志进行关键字匹配检索出所需要的信息,提出了基于日志分 析的 MySQL 数据库取证算法.大量的实验结果检验了该算法的有效性.

4、系统架构

客户端 服务器 mysqlbinlog 上传二进制日志文 日志文件 日志文件 解析后的明文 解析日志功能 解析后的明文 下载解析文件 按条件取证日志 取证数据 下载取证数据 客户端 服务器 mysqlbinlog

二、知识储备

1、数据库取证背景

​ 数据库是信息系统中不可或缺的部分。随着大数据时代的到来,数据库已经成为犯罪分子的目标,大量数据库被"拖库"用于网络盗窃和网络诈骗等活动。数据库具备完善的日志,因此案件现场的数据库蕴含了大量证据,可以根据这些证据回溯犯罪过程、固定证据并确定入侵者。

(1)数据库存储结构分析

​ 数据库存储结构有两个维度,一个是它的物理存储结构,另一个是它的逻辑存储结构。物理存储结构是从操作系统角度来看数据库的构成要素,通常包括数据文件和日志文件。逻辑存储结构是从数据库内部观看其构成要素,表示数据库系统如何组织和管理数据。

(2)数据文件

​ 每个数据库都包含数目不等的数据文件,用来记录具体的数据内容。多数数据库中的数据对象(表、索引等)被存储在这些可通过操作系统访问的数据文件中。另外,一些数据库系统也支持在没有文件系统的裸设备上存储数据。SQL Server的数据文件在物理存储结构上又分为主数据文件和次要数据文件。主数据文件是数据库的起点,每个数据库都有一一个主数据文件,其推荐文件扩展名是.mdf"。

(3)日志文件

​ 数据库的日志文件用于记录已经被作用在数据库上的所有变动操作。具体包括系统存储过程或数据定义语言对系统表所做的更改,每次分配或释放的扩展盘区,对表或者索引的删除操作等内容。但不包括对表的查询操作。尽管对于类似access, foxpro这样的桌面数据库并没有日志这样的概念,这些数据库中仅仅包括数据而已。但在Ondle、SQL Server之类的大型数据库系统中均包含数据文件和日志文件两个必要的部分。例如,sQLServer日志文件的推荐扩展名为“.ldf",Oracle日志文件的推荐扩展名是"log"。

​ 一些数据库的日志文件根据记录的时期,又分为事务日志文件和归档日志文件两类。事务日志文件用于记录数据库执行的任何交易,例如数据的新增、修改、删除等动作。归档日志文件可以认为是事务日志的复本。例如,Orace用于记录在线事务处理的事务B志文件称为重置日志文件 。

2、数据库系统取证

(1) 数据库电子证据收集范围和次序

**数据库证据收集范围:**调查人员进行数据库的证据收集之前,首先要清楚的掌握计算机中可能存放数据库相关证据数据的位置,确定证据收集的范围。另外,操作系统作为数据库系统下层载体,数据库系统所在的操作系统也记录了许多数据库的相关信息。表1罗列了在数据库系统所在服务器上可收集的相关证据数据的主要范围。

**数据库证据收集次序:**调查人员在了解了数据库系统证据数据的收集范围之后,需要进一步确定证据收集的优先次序,以实现数据库系统证据较全面和完整的收集,从而最大化的保全证据。调查人员应该根据数据库证据数据的稳定性和重要性来制定收集的次序,可以参考以下次序进行收集。

​ A. 数据库系统版本信息

​ B. 不稳定的数据库数据

​ C. 数据库临时表空间

​ D. 活动事务处理日志

​ E. 数据库文件

​ F. 数据库错误日志

​ G. 系统事件日志

​ H. 跟踪文件(trace files)

(2) 数据库系统相关电子证据收集

收集数据库系统版本信息

​ 准确找到被调查的数 据库系统,并且获取了该数据库系统的版本信息,系统目 录等信息,是进行有针对性的数据库取证的前提.即使是同类型的数据库系统,其不同的版本所支持的功能也不尽 相同.通常一台服务器只会存放一个数据库系统,此时找 到被调查的数据库系统不是难事.当服务器上同时运行多 个数据库系统时,需要调查人员根据被调查的应用服务程 序或WEB服务来追踪目标数据库.应用服务程序或 WEB服务作为连接用户和数据库的中间层,其服务配置 文件中,通常都会记录程序或服务所连接的数据库地址和 名称.

收集不稳定数据库数据

​ 不稳定的数据也称易失性数据,主要是指存储在主存和高速缓冲存储器中的数据。当调查人员进行数据库系统取证调查时,如果数据库 所在操作系统未关闭,允许联机调查,调查人员应该首先 对不稳定的数据库证据数据进行收集,这也是数据库取证 的难点.不稳定的数据库数据通常存放在各类缓存中,数 据库缓存按用途通常可以分为三类:一是日志缓存.为了 提高日志记录输出效率,数据库系统通常会先将日志记录 临时保存在日志缓冲区中,直到活动事务被提交或回滚. 二是数据缓存.为提高访问效率,数据库系统也会开辟数 据缓冲区,存储最近从数据文件中读取的数据.三是过程 缓存,也称程序缓存.用于存放最近的用户代码或执行计划.

收集系统临时数据库

​ 系统临时数据库用于为所有的临时表、临时存储过程以及其他的临时操作提供空间。SQL Server数据库系统的临时数据库是其tempDB数据库,Oracle数据库系统的临时数据库在其temp表空间中。系统临时数据库的数据保存在物理硬盘上,而不是存放在内存中,不过这是暂时的,不是永久存储的,每次重新启动都会导致以前数据的丢失。调查人员可以通过SQL命令来联机收集和分析系统临时数据库中数据。系统临时数据库操作的事务也会记录在日志中,但临时数据库的日志仅仅记录事务回滚(Undo)的信息,而不记录重做(Redo)事务的信息。

收集活动事务日志

​ 数据库系统每建立一个会话 连接,就开始一个活动事务,直到该事务被提交或回滚后 关闭会话连接,该活动事物结束.数据库系统的事物日志 从活动事务的开始到活动事物的结束一直保持对活动状态 进行记录,日志的这部分称为活动事务日志,用于实现事 务的完整性.数据库系统出于性能上的考虑,会将用户的 改动存入缓存中,又根据先写日志原则(Write Ahead Log),这些改变会立即写入事务日志,但不会立即写入数据文件.直到数据库的检查点发生,才会将已提交完成 的事务所修改的数据从缓存中写入数据文件.所以调查人 员对活动事务日志进行在线联机收集和分析,需要注意这 些已经发生但仍未作用到数据库磁盘实际数据上的修改操 作,以获取更多的线索和证据信息.

收集数据库数据文件和日志文件

​ 数据库的所有 数据都保存在数据文件中,并且使用日志文件来记录数据 库所做的所有更改操作,所以收集数据库的数据文件和日 志文件是数据库取证的主要环节.对于数据文件和日志文 件的收集,关键是准确找到数据库数据文件和日志文件的 存放位置,同时不要遗忘了数据库的附属文件.例如SQL Server数据库的数据文件还包括次要数据文件(.ndf).数 据库的数据文件和日志文件的存放位置可以通过数据库系 统控制文件或相关数据库系统命令来查找.获取了数据文 件和日志文件之后,就可以将这些文件加载到取证分析平台上的数据库系统或数据库文件分析工具上进行比对分 析.例如,调查人员可以借助日志分析工具 Log Explorer对SQL Server日志文件进行分析,借助LogMiner对 Oracle重做日志文件进行分析.

收集数据库系统错误日志

​ 数据库系统错误日志 记录数据库系统任何当前或潜在的问题,包括内部错误消 息,数据库重启的自动恢复消息或其他服务器级错误消 息.SQL Server的错误日志文件Error.Log记录了一个进程 成功完成与否,包括备份和还原操作,批处理命令或其他 脚本和进程.Oracle 的后台报警日志文件Sidalrt.Log记录了 数据库在启动,关闭和运行期间后台进程的活动情况.

收集默认的跟踪文件

​ 跟踪(trace)文件记录了 被监听数据库的各类操作信息,以便用户能根据文件内容 来解决各种故障.跟踪文件所记录的内容与数据库系统和 用户设置的审计追踪监听策略有关.取证人员可以通过对 跟踪文件的收集和分析来发现新线索,收集更完整的数据 库证据.例如,调查人员可以通过监听到的一个敏感数据 值的更新,追踪找到执行这个更新的用户,并跟踪这个用 户所做的所有操作来发现篡改或破坏

3、Mysql二进制日志文件的设置

(1). 开启bin-log二进制日志

​ 这里我也是参看这篇博文的:https://blog.csdn.net/demonson/article/details/80664141

看系统变量log_bin,如果其值为OFF,表示没有开启二进制日志(binary log),如果需要开启二进制日志,则必须在my.cnf中[mysqld]下面添加log-bin [=DIR[filename]] ,DIR参数指定二进制文件的存储路径;filename参数指定二级制文件的文件名。 其中filename可以任意指定,但最好有一定规范。系统变量log_bin是静态参数,不能动态修改的(因为它不是Dynamic Variable)。如下所示:

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> set global log_bin=mysql_bin;
ERROR 1238 (HY000): Variable 'log_bin' is a read only variable
mysql> 

1:修改my.cnf,在[mysqld]下面增加log_bin=mysql_bin_log,重启MySQL后,你就会发现log_bin变为了ON,二进制日志(binary log)默认放在数据目录下(系统变量datadir下),如下所示:

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
 
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name                   | Value                              |
+---------------------------------+------------------------------------+
| log_bin                         | ON                                 |
| log_bin_basename                | /var/lib/mysql/mysql_bin_log       |
| log_bin_index                   | /var/lib/mysql/mysql_bin_log.index |
| log_bin_trust_function_creators | OFF                                |
| log_bin_use_v1_row_events       | OFF                                |
| sql_log_bin                     | ON                                 |
+---------------------------------+------------------------------------+
6 rows in set (0.00 sec)
 
mysql> 

(2). 查看bin-log二进制日志

系统变量log_bin的值为OFF表示没有开启二进制日志(binary log)。ON表示开启了二进制日志(binary log)

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
 
mysql> 

查看当前服务器所有的二进制日志文件

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 |      9653 |
| mysql-bin.000006 | 340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)

当然你还可以使用下面命令查看

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000004 | 478421400 |
| mysql-bin.000005 |      9653 |
| mysql-bin.000006 |  340631484 |
+------------------+-----------+
3 rows in set (0.00 sec)
 
mysql> 

查看当前二进制日志文件状态

mysql> show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 373655406 |              |                  |                   |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

(3)、mysql二进制日志文件解析步骤详解

​ 在获取到mysql二进制日志文件之后,用X-Ways Forensics取证工具对这个文件进行读取,如下图所示,在参考文献中就给出了mysql二进制文件的详细解读。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4m7o1te-1595653305422)(D:\工作必要\研一\课程\计算机取证\数据库取证\微信截图_20200414161131.png)]

为了验证 MySQL 二进制日志结构分析的正确性,使用二进制文件查看器选取一条记录进行分析,如图 18 所示,小图(a)(b)©分别为日志记录(QUERY 类型)中的 Common-Header,Post-Header,Body 的三部分,在 MySQL 二进制日志中的编码模式是小端模式[33]。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBPTxdwl-1595653305426)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200531170609201.png)]

(1)图18中的(a)图中一共19个字节,E4F32F53表示时间,因为二进制是用小尾数表示的所以上面四个字节表示0x532FF3E4=1395651556(十进制),转换成时间就是2014/3/24 16:59:16.02表示类型,就是QUERY类型,01 00 00 00表示server-id,0x00000001=1, 77 00 00 00表示t 大小,就是0x00000077=119;3E010000表示记录结束的地方,就是离文件起始位置有0x0000013E=318个字节;0000是标识位。

(2)图18中的(b)图中一共13个字节,17 00 00 00表示线程id,大小为23;00 00 00 00 表示exec-time,大小为零;04表示数据库名字的长度,大小 为4;00 00表示错误代码,大小为0,表示无错;21 00表示status_var_len的长度为33

(3)图18中的©图中一共87个字节,这个值可以有total-size减去Common-Header和Post-Header的长度得出,119-19-23=87,该结果与记录中实际的长度是一样的;00 00 00 00 00 01 00 00 20 50 00 00 00 00 06 03 73 74 64 04 08 00 08 00 21 00 0C 01 74 65 73 74 00 这里一共33个字节,表示状态的值;74 65 73 74 00这里一共5个字节表示,表示数据库的名字,ascii码的转换可以得出该数据库的名字为test;75 70 64 61 74 65 20 74 65 74 20 74 70 74 20 73 65 74 20 65 74 20 6E 61 6D 65 3D 27 79 61 6C 69 65 73 68 69 27 20 31 这里 45 个字节,该段二进制内容根据 ascii 码 转换后可以得出字符串为:update tset set name=‘yaliceshi’ where id = 1, 该字符串为 SQL 的命令语句,最后的四个字节 3A CC 18 EC 是校验码,判断整条 记录是否正确。

​ 最后用 mysqlbinlog 程序将该条记录转换成文本文件,可以得到如图 19 中的信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrCMldTj-1595653305429)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200531170828868.png)]

首先使用X-Ways Forensics查看日志的二进制文件,选区一段二进制,验证上述解析步骤如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOllqWnr-1595653305433)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604103913514.png)]

然后将二进制文件转为字符串得到 insert user values(“fdsa”,“89”)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-neq6yKGZ-1595653305437)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604103934701.png)]

4、Mysql日志解析结果

(1)INSERT操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isx2zynt-1595653305440)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604100637957.png)]

从分析结果中可得到,在2020/04/22 14:58:52 对数据库插入一组数据

INSERT INTO strings (string, state) VALUES (‘this is a sun’, ‘0’)

在2020/04/22 15:03:30 对数据库插入一组数据

insert strings VALUES(“fjdklas”, 0)

(2)UPDATE操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrSxVotf-1595653305443)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604100753379.png)]

从分析结果中可得到,在2020/04/22 15:06:59 对数据库更新一组数据

UPDATE strings SET string=‘this is an sun’ WHERE (string=‘this is a sun’) AND (state=‘0’)

(3)SELETE操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ik8Mx0Nq-1595653305446)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200604100812956.png)]

从分析结果中可得到,在2020/04/22 15:06:04 对数据库插入一组数据

DELETE FROM strings WHERE (string=‘fjdklas’) AND (state=‘0’)

三、代码分块

1、前后端交互(axios与flask接口交互)

前端axios:

get_binary_str(){
		      	temp_list = []
		      	axios({
					method: 'post',
					url: 'http://127.0.0.1/get_binary_str',
					data: JSON.stringify({
						id: '12',
						lastName: 'Flintstone'
					})
				}).then(function(response) {
					console.log("请求成功")	
					temp = {}
					temp['str'] = response.data
					temp_list.push(temp)
				
				}).catch(function(error) {
					console.log("请求失败")
					console.log(error);
				});
				this.binary_to_str_textarea = temp_list
		      },//get_binary_str

后端Flask:

@app.route('/get_type_sql',methods = ['POST', 'GET'])
def get_type_sql():
    get_data = json.loads(request.get_data())
    type_list = get_data['id']#获取前端传来的参数
    get_data = json.loads(request.get_data())
    type_list = get_data['type']#获取前端传来的参数
    result = binary_to_str()
    return Response(json.dumps(result), content_type='application/json')

2、python调用mysqlbinlog.exe解析mysql二进制日志文件

(1)mysqlbinlog工具

在Windows环境下,安装完成Mysql后,在安装目录bin下会存在mysqlbinlog.exe应用程序。binlog是二进制内容文件,人类是无法直视的。而mysqlbinlog这个工具是用来辅助人类查看Mysql数据库binlog文件内容的。例如下图,使用mysqlbinlog.exe将二进制转换为可读文档。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7U1315s-1595653305449)(D:\工作必要\研一\课程\计算机取证\数据库取证\QQ截图20200414215404.png)]

(2)使用python调用外部exe程序

将结果存储在a.txt文档中

os.system('mysqlbinlog.exe file/mysql-bin.000002 > ../a.txt')

然后将a.txt中的数据进行划分

源码如下:

#-*-coding:utf-8-*-
import re
import os
def Print_list(insert_list, update_list, delete_list):
    print ("==================insert==================")
    for i in insert_list:
        print(i)
    print ("==================update==================")
    for i in update_list:
        print(i)
    print ("==================delete==================")
    for i in delete_list:
        print(i)
def to_str(filename):
    os.system("mysqlbinlog.exe file/" + filename +" > ../a.txt")

def to_time(str_time):
    str_time_list = list(str_time)
    str_time_list.insert(4,'/')
    str_time_list.insert(2, '/')
    str2 = "".join(str_time_list)
    return "20" + str2

def binary_to_str():
    os.system('mysqlbinlog.exe file/mysql-bin.000002 > ../a.txt')

    # os.system('mysqlbinlog.exe file/mysql_bin_log.000001 > ../a.txt')

    # print(a)
    insert_list = []
    update_list = []
    delete_list = []

    f = open('../a.txt', encoding='utf-8')
    content = f.read()
    list = content.split("# at")
    for i in list:
        a = {}
        index = re.findall('insert ', i, flags=re.IGNORECASE)
        if len(index) != 0:
            a['time'] = to_time(i.split('\n')[1][1:17])
            a['type'] = "INSERT"
            a['SQL'] = i[i.find(index[0]): -1]
            insert_list.append(a)
            # insert_list.append(i[i.find(index[0]) : -1])
            continue
        index = re.findall('update ', i, flags=re.IGNORECASE)
        if len(index) != 0:
            a['time'] = to_time(i.split('\n')[1][1:17])
            a['type'] = "UPDATE"
            a['SQL'] = i[i.find(index[0]): -1]
            update_list.append(a)
            # update_list.append(i[i.find(index[0]): -1])
            continue
        index = re.findall('delete ', i, flags=re.IGNORECASE)
        if len(index) != 0:
            a['time'] = to_time(i.split('\n')[1][1:17])
            a['type'] = "DELETE"
            a['SQL'] = i[i.find(index[0]): -1]
            delete_list.append(a)
            # delete_list.append(i[i.find(index[0]): -1])
    result = {}
    result['insert'] = insert_list
    result['update'] = update_list
    result['delete'] = delete_list
    Print_list(insert_list, update_list, delete_list)
    return result

if __name__ == '__main__':
    binary_to_str()


得到划分结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hibLb2TT-1595653305452)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200531205340987.png)]

3、将查询后的数据分类显示在不同颜色表格中

表格显示:

<el-col :span="12">
							<div class="grid-content bg-purple">
								<el-table :data="abaloneData" height="800px" border style="width: 100%" :cell-style="cellStyle">
									<el-table-column prop="type" label="类型" > </el-table-column>
									<el-table-column prop="time" label="时间"> </el-table-column>
									<el-table-column prop="SQL" label="命令语句"> </el-table-column>
								</el-table>
							</div>
						</el-col>
cellStyle({row, column, rowIndex, columnIndex}) {//根据测试结果动态调整单元格样式,成功-绿色,失败-红色,不支持-黄色
                let cellStyle;
                switch (row.type) {
                    case 'INSERT':
                        cellStyle = 'background: #BCDBFB;color:white;';
                        break;
                    case 'UPDATE':
                        cellStyle = 'background: #84C465;color:white;';
                        break;
                    case 'DELETE':
                        cellStyle = 'background: #F99191;color:white;';
                        break;
                    default:
                        cellStyle = '';
                }
                if (column.label == '类型')
                    return cellStyle;
            }//cellStyle

4、前端数据保存为txt文件、xls表格文件

(1)js将字符串保存为txt文档

download_file(){
						console.log("导出txt文档数据")
						//encodeURIComponent解决中文乱码
						var uri = 'data:text/XLS;charset=utf-8,\ufeff' + encodeURIComponent(this.binary_to_str_textarea[0]['str']);//获取字符串
						//通过创建a标签实现
						var link = document.createElement("a");
						link.href = uri;
						//对下载的文件命名
						link.download = "解析文档.txt";
						document.body.appendChild(link);
						link.click();
						document.body.removeChild(link);
					},//download_file

(2)js将数组保存为xls表格文件

print_data() {
						console.log("导出数据")
						list_name = ["type","time",  "SQL"]
						let title = list_name;
		        let filter = [];  //不导出的字段
		        this.exportExcel(this.abaloneData,'测试excel',title, filter);
					}, //print_data		



exportExcel(JSONData, FileName, title, filter) {
							console.log("输出为表格")
						    if (!JSONData) return;
						    //转化json为object
						    var arrData = typeof JSONData != "object" ? JSON.parse(JSONData) : JSONData;
						    var excel = "<table>";
						    //设置表头
						    var row = "<tr>";
						    if (title) { //使用标题项
						      for (var i in title) {
						        row += "<th align='center'>" + title[i] + "</th>";
						      }
						    } else {//不使用标题项
						      for (var i in arrData[0]) {
						        row += "<th align='center'>" + i + "</th>";
						      }
						    }
						    excel += row + "</tr>";
						    //设置数据
						    for (var i = 0; i < arrData.length; i++) {
						      var row = "<tr>";
						      for (var index in arrData[i]) {
						        //判断是否有过滤行
						        if (filter) {
						          if (filter.indexOf(index) == -1) {
						            var value = arrData[i][index] == null ? "" : arrData[i][index];
						            row += "<td>" + value + "</td>";
						          }
						        } else {
						          var value = arrData[i][index] == null ? "" : arrData[i][index];
						          row += "<td align='center'>" + value + "</td>";
						        }
						      }
						      excel += row + "</tr>";
						    }
						    excel += "</table>";
						    var excelFile =
						      "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
						    excelFile +=
						      '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
						    excelFile +=
						      '<meta http-equiv="content-type" content="application/vnd.ms-excel';
						    excelFile += '; charset=UTF-8">';
						    excelFile += "<head>";
						    excelFile += "<!--[if gte mso 9]>";
						    excelFile += "<xml>";
						    excelFile += "<x:ExcelWorkbook>";
						    excelFile += "<x:ExcelWorksheets>";
						    excelFile += "<x:ExcelWorksheet>";
						    excelFile += "<x:Name>";
						    excelFile += "{worksheet}";
						    excelFile += "</x:Name>";
						    excelFile += "<x:WorksheetOptions>";
						    excelFile += "<x:DisplayGridlines/>";
						    excelFile += "</x:WorksheetOptions>";
						    excelFile += "</x:ExcelWorksheet>";
						    excelFile += "</x:ExcelWorksheets>";
						    excelFile += "</x:ExcelWorkbook>";
						    excelFile += "</xml>";
						    excelFile += "<![endif]-->";
						    excelFile += "</head>";
						    excelFile += "<body>";
						    excelFile += excel;
						    excelFile += "</body>";
						    excelFile += "</html>";
						    var uri =
						      "data:application/vnd.ms-excel;charset=utf-8," +
						      encodeURIComponent(excelFile);
						    var link = document.createElement("a");
						    link.href = uri;
						    link.style = "visibility:hidden";
						    link.download = FileName + ".xls";
						    document.body.appendChild(link);
						    link.click();
						    document.body.removeChild(link);
						},//exportExcel

四、总结与展望

1、总结

​ 本文通过研究了 MySQL 数据库的整体架构,MySQL 数据库的日志功能,然后提出了基于日志分析的 MySQL 数据库取证算 法,并以该算法为基础实现了基于日志分析的 MySQL 数据库取证系统,并且对 算法和系统进行了实现和测试.。

(1) 本文分析出了 MySQL 二进制日志文件中日志 信息的记录结构,从而提出了基于日志分析的 MySQL 数据库取证算法,实现了 对 MySQL 数据库的取证;

(2)以基于日志分析的 MySQL 数据库取证算法为基础,实现了基于日志分 析的MySQL 数据库取证系统.该系统实现了自动查找MySQL数据库的日志文件, 对MySQL 数据库的关键数据进行取证的功能,解决了MySQL数据库的取证问题。

2、展望

​ 本文分析的MySQL二进制日志文件算法,能够将二进制日志文件的二进制转换为可读明文。本文使用的mysqlbinlog工具,系统中用户将二进制日志文件上传进系统中,然后由工具将二进制文件转换为明文,系统根据用户的需求得到解析后的数据。理论上可以根据解析之后的明文,将数据库中一段事件内的删除数据恢复等一系列操作。

五、参考文献

[1] 基于日志分析的MySQL数据库取证算法研究
[2] bin-log二进制日志:https://blog.csdn.net/demonson/article/details/80664141
[3] 数据库系统取证实现研究

猜你喜欢

转载自blog.csdn.net/qq_38234785/article/details/107577281