目的
在代码审计的时候经常会想看看某个访问会触发哪些数据库操作。目前已知的数据库审计有多家大型厂商的设备,还有seay源码审计系统中的数据库监控1.0
但是、开源的已知的就只有seay源码审计系统中的。而且因作者跑路。不再更新,能够允许监控的mysql数据库版本仅仅支持到5.1。
所以,自行查找、翻阅资料,准备开发C#的数据库审计系统
方法与原理
在绝大部分数据库系统中(你自己开发的数据库系统除外),都会有针对数据库运行的日志记录。如果能在插件中直接读取即可。mysql就可以支持。主要的数据库命令如下:
set global general_log=on;//开启日志
show variables like 'general_log_file';//获取日志文件地址
具体实现方法
1、打开mysql日志系统
2、获得日志文件地址。
3、关闭日志服务
4、在日志文件中插入一串随机字符串(下断点)
5、启动日志服务器
6、用户执行mysql语句
7、终止日志服务
8、读取日志文件内容,并查找第4步记录的随机字符串。
9、读取该字符串以下所有内容
10、处理无用信息,并打印
11、特殊功能:将日志文件置空
功能的实现与重要代码
public void SqlNonQuery(string sql, ref MySqlConnection connection)
{
using (MySqlCommand sqlQury = new MySqlCommand(sql, connection))
{
sqlQury.ExecuteNonQuery();
}
}
//链接与启动
public string Main(ref MySqlConnection conn)
{
this.SetLogOn(ref conn);
string url = this.GetLogUrl(ref conn);
this.SetLogOff(ref conn);
conn.Close();
return url;
}
public MySqlConnection Connected(string server, string user, string password, string database = "information_schema", string port = "3306")
{
String connetStr = "server=127.0.0.1;port=3306;user=root;password=root; database=information_schema;";
// server=127.0.0.1/localhost 代表本机,端口号port默认是3306可以不写
MySqlConnection conn = new MySqlConnection(connetStr);
try
{
//dosomething
}
catch (MySqlException ex)
{
MessageBox.Show(ex.Message);
return conn;
}
}
//打开日志
public void SetLogOn(ref MySqlConnection connection)
{
//dosomething
}
// 关闭日志
public void SetLogOff(ref MySqlConnection connection)
{
string sql = "set global general_log=off;";
SqlNonQuery(sql, ref connection);
}
//获取Log地址
protected string GetLogUrl(ref MySqlConnection connection)
{
string result = null;
string sql = "show variables like 'general_log_file';"; //看看日志文件保存位置
using (MySqlCommand sqlQury = new MySqlCommand(sql, connection))
{
//dosomething
}
return result;
}
//关闭链接。
public void Closed(ref MySqlConnection connection)
{
string sql = "set global general_log=off;";
if (connection.State == System.Data.ConnectionState.Closed)
return;
SetLogOn(ref connection);
SqlNonQuery(sql, ref connection);
if (connection.State == ConnectionState.Open || connection.State == ConnectionState.Broken)
connection.Close();
}
其他说明
1、为什么会存在关闭又开启日志服务。
答:C#在读取文件的时候,mysql如果开启日志服务,那么该文件被占用。无法读取。(如果有好的方法也请告诉我)
懒癌党福星
下载地址 https://pan.baidu.com/s/1j-dMtJYiOk2Pfo7QoEXHMA
手册地址:https://www.kancloud.cn/qq496672097/limanmanexp/2139143