目的
在程式碼審計的時候經常會想看看某個訪問會觸發哪些資料庫操作。目前已知的資料庫審計有多家大型廠商的裝置,還有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