limanmanExp資料庫審計設計思路與重要程式碼

李慢慢233發表於2021-04-06

目的

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

相關文章