本發(fā)明涉及計算機應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法。
背景技術(shù):
caché數(shù)據(jù)庫是美國intersystems公司產(chǎn)品,新一代超高性能數(shù)據(jù)庫。適合大型應(yīng)用,且因其速度快、靈活性、接口容易、升級擴容方便等優(yōu)勢,適用于各類應(yīng)用環(huán)境,其市場占有率逐年提升。caché數(shù)據(jù)庫在國外已有廣泛的應(yīng)用,美國和歐洲醫(yī)療系統(tǒng)占有70%的市場份額,國內(nèi)的醫(yī)療和金融企業(yè)已經(jīng)開始投入使用caché數(shù)據(jù)庫。
對于數(shù)據(jù)庫管理來說,保護數(shù)據(jù)不受內(nèi)部和外部侵害是一項重要工作。尤其是在caché客戶機較多時,訪問量和數(shù)據(jù)傳輸量都較大,客戶機與服務(wù)器之間的通訊過程幾乎是一個黑匣子,在應(yīng)用系統(tǒng)發(fā)生異常時,很難在系統(tǒng)層面對caché數(shù)據(jù)庫的訪問使用情況進行全面的分析。caché客戶端對于caché的操作直接關(guān)系到數(shù)據(jù)庫的安全,所以對用戶數(shù)據(jù)庫業(yè)務(wù)進行在線審計、行為回溯和風(fēng)險控制有著十分重要的意義。
技術(shù)實現(xiàn)要素:
本發(fā)明提供了一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法,通過對使用tcp/ip協(xié)議傳輸?shù)腸aché數(shù)據(jù)庫通訊協(xié)議51版本數(shù)據(jù)包進行旁路監(jiān)聽和解析,處理之后就得到每位用戶的sql操作命令。
為了實現(xiàn)上述目的,本發(fā)明采取了如下技術(shù)方案。
一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法,其特征在于,包括:
采用旁路獲取網(wǎng)絡(luò)中客戶端向caché數(shù)據(jù)庫服務(wù)器發(fā)送的通信協(xié)議數(shù)據(jù)包;
將獲取到的所述通信協(xié)議數(shù)據(jù)包的數(shù)據(jù)部分進行過濾和解析;
根據(jù)所述的過濾和解析結(jié)果還原出客戶端完整的sql命令。
所述的將獲取到的所述通信協(xié)議數(shù)據(jù)包的數(shù)據(jù)部分進行過濾和解析,包括:
步驟1:讀取caché數(shù)據(jù)庫通訊協(xié)議數(shù)據(jù)包第1至第4個字節(jié)的值并賦給變量msglength中;
步驟2:跳過8個字節(jié),讀取第13、14個字節(jié)的值并賦給變量msgtype,判斷所述msgtype的值,若所述msgtype的值是0x440x51,則所述通信協(xié)議數(shù)據(jù)包為select語句,進行m1模塊處理,若所述msgtype的值不是0x440x51,則執(zhí)行步驟3;
步驟3:若所述msgtype的值是0x440x55,則所述通信協(xié)議數(shù)據(jù)包為除select語句外的sql語句,進行m2模塊處理,若msgtype的值不是0x440x55,則所述通信協(xié)議數(shù)據(jù)包不是sql語句數(shù)據(jù)包,結(jié)束流程。
所述的m1模塊處理步驟為:
(11)讀取caché數(shù)據(jù)包data部分第4個字節(jié)的值并賦給變量sqllength中;
(12)定義指針sqlstart指向caché數(shù)據(jù)包data部分第6個字節(jié),sqlend=sqlstart+sqllength-2;
(13)讀取指針sqlstart到指針sqlend指向的字符串為select語句并保存;
(14)根據(jù)*(sqlend+1)的值情況執(zhí)行以下步驟:若*(sqlend+1)的值是0x02,則該數(shù)據(jù)包包含的select語句沒有參數(shù),執(zhí)行步驟(118);若*(sqlend+1)的值不是0x02,則執(zhí)行步驟(15);
(15)定義指針parapos指向指針(sqlend+3)指向的位置,并讀取*(parapos)的值并賦給變量paracount;
(16)跳過[6*(paracount-1)+11]個字節(jié),定義變量skip=12;
(17)定義指針parastart指向[parapos+6*(paracount-1)+skip];
(18)定義變量i=1;
(19)讀取*(parastart)的值為paralength;
(110)讀取指針parastart到指針(parastart+paralength)指向的字符串為buffer(i);
(111)定義指針paradis指向字符串buffer(i)第2個字節(jié);
(112)若*(paradis)的值為0x01,則執(zhí)行步驟(113),若*(paradis)的值不是0x01,則執(zhí)行步驟(114);
(113)讀取指針paradis到指針(paradis+paralength-2)指向的字符串為para(i);
(114)讀取指針paradis到指針(paradis+paralength-2)指向的字符串并轉(zhuǎn)換為二進制數(shù)并記為para(i);
(115)若i=paracount,則執(zhí)行步驟(118),否則,執(zhí)行步驟(116);
(116)將變量i的值加1;
(117)parastart=parastart+paralength,并重復(fù)執(zhí)行步驟(19);
(118)輸出select語句和參數(shù)para(i),1<=i<=paracount。
所述的m2模塊處理步驟為:
(21)讀取caché數(shù)據(jù)包data部分第4個字節(jié)的值并賦給變量sqllength中;
(22)定義指針sqlstart指向caché數(shù)據(jù)包data部分第6個字節(jié),sqlend=sqlstart+sqllength-2;
(23)讀取指針sqlstart到指針sqlend指向的字符串為select語句并保存;
(24)根據(jù)*(sqlend+1)的值情況執(zhí)行以下步驟:若*(sqlend+1)的值是0x02,則該數(shù)據(jù)包包含的sql語句為create語句或drop語句,執(zhí)行步驟(25);若*(sqlend+1)的值不是0x02,則該數(shù)據(jù)包包含的sql語句為insert、update或delete語句,進行m3模塊處理;
(25)保存并輸出create或drop語句。
所述的m3模塊處理步驟為:
(31)定義指針parapos指向指針(sqlend+3)指向的位置,并讀取*(parapos)的值并賦給變量paracount;
(32)跳過[6*(paracount-1)+3]個字節(jié);
(33)若指針[parapos+6*(paracount-1)+4]指向的字節(jié)的值為0x02,則該數(shù)據(jù)包包含的sql語句為update或delete語句,執(zhí)行步驟(34);若指針[parapos+6*(paracount-1)+4]指向的字節(jié)的值不是0x02,則該數(shù)據(jù)包包含的sql語句為insert語句,執(zhí)行步驟(35);
(34)定義變量skip=12;
(35)定義變量skip=13;
(36)定義指針parastart指向[parapos+6*(paracount-1)+4+skip];
(37)定義變量i=1;
(38)讀取*(parastart)的值為paralength;
(39)讀取指針parastart到指針(parastart+paralength)指向的字符串為buffer(i);
(310)定義指針paradis指向字符串buffer(i)第2個字節(jié);
(311)若*(paradis)的值為0x01,則執(zhí)行步驟(312),若*(paradis)的值不是0x01,則執(zhí)行步驟(313);
(312)讀取指針paradis到指針(paradis+paralength-2)指向的字符串為para(i);
(313)讀取指針paradis到指針(paradis+paralength-2)指向的字符串并轉(zhuǎn)換為二進制數(shù)并記為para(i);
(314)若i=paracount,則執(zhí)行步驟(317),否則,執(zhí)行步驟(315);
(315)將變量i的值加1;
(316)parastart=parastart+paralength,并重復(fù)執(zhí)行步驟(38);
(317)輸出sql語句和參數(shù)para(i),1<=i<=paracount。
所述的通信協(xié)議數(shù)據(jù)包為direct_update類型數(shù)據(jù)包或direct_query類型數(shù)據(jù)包,其中,
caché數(shù)據(jù)庫通訊協(xié)議報文包頭部分的第13、14個字節(jié)值是0x440x55的數(shù)據(jù)包為所述direct_update類型數(shù)據(jù)包;
caché數(shù)據(jù)庫通訊協(xié)議報文包頭部分的第13、14個字節(jié)值是0x440x51的數(shù)據(jù)包為所述direct_query類型數(shù)據(jù)包。
由上述本發(fā)明的實施例提供的技術(shù)方案可以看出,本發(fā)明實施例不需要對應(yīng)用系統(tǒng)進行任何的配置改動和變更,對應(yīng)用系統(tǒng)的正常運行沒有任何影響,可以給用戶、應(yīng)用系統(tǒng)提供商及時了解系統(tǒng)運行狀態(tài)提供有力的支持,同時可以為caché數(shù)據(jù)庫細(xì)粒度審計、精準(zhǔn)化行為回溯、全方位風(fēng)險控制功能和安全審計功能提供理論基礎(chǔ)。
本發(fā)明附加的方面和優(yōu)點將在下面的描述中部分給出,這些將從下面的描述中變得明顯,或通過本發(fā)明的實踐了解到。
附圖說明
為了更清楚地說明本發(fā)明實施例的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的數(shù)據(jù)包類型的處理流程圖;
圖2為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的m1模塊處理流程圖;
圖3為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的m2模塊處理流程圖;
圖4為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的m3模塊處理流程圖。
具體實施方式
下面詳細(xì)描述本發(fā)明的實施方式,所述實施方式的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施方式是示例性的,僅用于解釋本發(fā)明,而不能解釋為對本發(fā)明的限制。
本技術(shù)領(lǐng)域技術(shù)人員可以理解,除非特意聲明,這里使用的單數(shù)形式“一”、“一個”、“所述”和“該”也可包括復(fù)數(shù)形式。應(yīng)該進一步理解的是,本發(fā)明的說明書中使用的措辭“包括”是指存在所述特征、整數(shù)、步驟、操作、元件和/或組件,但是并不排除存在或添加一個或多個其他特征、整數(shù)、步驟、操作、元件、組件和/或它們的組。應(yīng)該理解,當(dāng)我們稱元件被“連接”或“耦接”到另一元件時,它可以直接連接或耦接到其他元件,或者也可以存在中間元件。此外,這里使用的“連接”或“耦接”可以包括無線連接或耦接。這里使用的措辭“和/或”包括一個或更多個相關(guān)聯(lián)的列出項的任一單元和全部組合。
本技術(shù)領(lǐng)域技術(shù)人員可以理解,除非另外定義,這里使用的所有術(shù)語(包括技術(shù)術(shù)語和科學(xué)術(shù)語)具有與本發(fā)明所屬領(lǐng)域中的普通技術(shù)人員的一般理解相同的意義。還應(yīng)該理解的是,諸如通用字典中定義的那些術(shù)語應(yīng)該被理解為具有與現(xiàn)有技術(shù)的上下文中的意義一致的意義,并且除非像這里一樣定義,不會用理想化或過于正式的含義來解釋。
為便于對本發(fā)明實施例的理解,下面將結(jié)合附圖以幾個具體實施例為例做進一步的解釋說明,且各個實施例并不構(gòu)成對本發(fā)明實施例的限定。
一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法,包括:
采用旁路獲取網(wǎng)絡(luò)中客戶端向caché數(shù)據(jù)庫服務(wù)器發(fā)送的通信協(xié)議數(shù)據(jù)包;
將獲取到的通信協(xié)議數(shù)據(jù)包的數(shù)據(jù)部分進行過濾和解析;
根據(jù)所述的過濾和解析結(jié)果還原出客戶端完整的sql命令。
所述的通信協(xié)議數(shù)據(jù)包為direct_update類型數(shù)據(jù)包或direct_query類型數(shù)據(jù)包,其中,
caché數(shù)據(jù)庫通訊協(xié)議報文包頭部分的第13、14個字節(jié)值是0x440x55的數(shù)據(jù)包為所述direct_update類型數(shù)據(jù)包;
caché數(shù)據(jù)庫通訊協(xié)議報文包頭部分的第13、14個字節(jié)值是0x440x51的數(shù)據(jù)包為所述direct_query類型數(shù)據(jù)包。
圖1為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的數(shù)據(jù)包類型的處理流程圖;如圖1所示:
解析和還原客戶端完整的sql命令的具體步驟如下:
步驟1:讀取caché數(shù)據(jù)庫通訊協(xié)議數(shù)據(jù)包第1至第4個字節(jié)的值并賦給變量msglength中;
步驟2:跳過8個字節(jié),讀取第13、14個字節(jié)的值并賦給變量msgtype,判斷所述msgtype的值,若所述msgtype的值是0x440x51,則所述通信協(xié)議數(shù)據(jù)包為select語句,進行m1模塊處理,若所述msgtype的值不是0x440x51,則執(zhí)行步驟3;
步驟3:若所述msgtype的值是0x440x55,則所述通信協(xié)議數(shù)據(jù)包為除select語句外的sql語句,進行m2模塊處理,若msgtype的值不是0x440x55,則所述通信協(xié)議數(shù)據(jù)包不是sql語句數(shù)據(jù)包,結(jié)束流程。
圖2為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的m1模塊處理流程圖;如圖2所示:
m1模塊處理步驟如下:
(11)讀取caché數(shù)據(jù)包data部分第4個字節(jié)的值并賦給變量sqllength中;
(12)定義指針sqlstart指向caché數(shù)據(jù)包data部分第6個字節(jié),sqlend=sqlstart+sqllength-2;
(13)讀取指針sqlstart到指針sqlend指向的字符串為select語句并保存;
(14)根據(jù)*(sqlend+1)的值情況執(zhí)行以下步驟:若*(sqlend+1)的值是0x02,則該數(shù)據(jù)包包含的select語句沒有參數(shù),執(zhí)行步驟(118);若*(sqlend+1)的值不是0x02,則執(zhí)行步驟(15);
(15)定義指針parapos指向指針(sqlend+3)指向的位置,并讀取*(parapos)的值并賦給變量paracount;
(16)跳過[6*(paracount-1)+11]個字節(jié),定義變量skip=12;
(17)定義指針parastart指向[parapos+6*(paracount-1)+skip];
(18)定義變量i=1;
(19)讀取*(parastart)的值為paralength;
(110)讀取指針parastart到指針(parastart+paralength)指向的字符串為buffer(i);
(111)定義指針paradis指向字符串buffer(i)第2個字節(jié);
(112)若*(paradis)的值為0x01,則執(zhí)行步驟(113),若*(paradis)的值不是0x01,則執(zhí)行步驟(114);
(113)讀取指針paradis到指針(paradis+paralength-2)指向的字符串為para(i);
(114)讀取指針paradis到指針(paradis+paralength-2)指向的字符串并轉(zhuǎn)換為二進制數(shù)并記為para(i);
(115)若i=paracount,則執(zhí)行步驟(118),否則,執(zhí)行步驟(116);
(116)將變量i的值加1;
(117)parastart=parastart+paralength,并重復(fù)執(zhí)行步驟(19);
(118)輸出select語句和參數(shù)para(i),1<=i<=paracount。
圖3為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的m2模塊處理流程圖;如圖3所示:
m2模塊處理步驟如下:
(21)讀取caché數(shù)據(jù)包data部分第4個字節(jié)的值并賦給變量sqllength中;
(22)定義指針sqlstart指向caché數(shù)據(jù)包data部分第6個字節(jié),sqlend=sqlstart+sqllength-2;
(23)讀取指針sqlstart到指針sqlend指向的字符串為select語句并保存;
(24)根據(jù)*(sqlend+1)的值情況執(zhí)行以下步驟:若*(sqlend+1)的值是0x02,則該數(shù)據(jù)包包含的sql語句為create語句或drop語句,執(zhí)行步驟(25);若*(sqlend+1)的值不是0x02,則該數(shù)據(jù)包包含的sql語句為insert、update或delete語句,進行m3模塊處理;
(25)保存并輸出create或drop語句。
圖4為本發(fā)明實施例提供的一種解析和還原caché數(shù)據(jù)庫通訊協(xié)議中sql命令的方法的m3模塊處理流程圖;如圖4所示:
m3模塊處理步驟如下:
(31)定義指針parapos指向指針(sqlend+3)指向的位置,并讀取*(parapos)
的值并賦給變量paracount;
(32)跳過[6*(paracount-1)+3]個字節(jié);
(33)若指針[parapos+6*(paracount-1)+4]指向的字節(jié)的值為0x02,則該數(shù)據(jù)包包含的sql語句為update或delete語句,執(zhí)行步驟(34);若指針[parapos+6*(paracount-1)+4]指向的字節(jié)的值不是0x02,則該數(shù)據(jù)包包含的sql語句為insert語句,執(zhí)行步驟(35);
(34)定義變量skip=12;
(35)定義變量skip=13;
(36)定義指針parastart指向[parapos+6*(paracount-1)+4+skip];
(37)定義變量i=1;
(38)讀取*(parastart)的值為paralength;
(39)讀取指針parastart到指針(parastart+paralength)指向的字符串為buffer(i);
(310)定義指針paradis指向字符串buffer(i)第2個字節(jié);
(311)若*(paradis)的值為0x01,則執(zhí)行步驟(312),若*(paradis)的值不是0x01,則執(zhí)行步驟(313);
(312)讀取指針paradis到指針(paradis+paralength-2)指向的字符串為para(i);
(313)讀取指針paradis到指針(paradis+paralength-2)指向的字符串并轉(zhuǎn)換為二進制數(shù)并記為para(i);
(314)若i=paracount,則執(zhí)行步驟(317),否則,執(zhí)行步驟(315);
(315)將變量i的值加1;
(316)parastart=parastart+paralength,并重復(fù)執(zhí)行步驟(38);
(317)輸出sql語句和參數(shù)para(i),1<=i<=paracount。
綜上所述,本發(fā)明實施例通過分析caché數(shù)據(jù)庫的應(yīng)用系統(tǒng)客戶端與caché數(shù)據(jù)庫之間通訊的direct_update和direct_query類型數(shù)據(jù)包,將數(shù)據(jù)包進行有效的結(jié)構(gòu)分解,過濾出數(shù)據(jù)包中的sql語句。本發(fā)明不需要對應(yīng)用系統(tǒng)進行任何的配置改動和變更,對應(yīng)用系統(tǒng)的正常運行沒有任何影響,可以給用戶、應(yīng)用系統(tǒng)提供商及時了解系統(tǒng)運行狀態(tài)提供有力的支持,同時可以為caché數(shù)據(jù)庫細(xì)粒度審計、精準(zhǔn)化行為回溯、全方位風(fēng)險控制功能和安全審計功能提供理論基礎(chǔ)。
本領(lǐng)域普通技術(shù)人員可以理解:附圖只是一個實施例的示意圖,附圖中的模塊或流程并不一定是實施本發(fā)明所必須的。
本說明書中的各個實施例均采用遞進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于裝置或系統(tǒng)實施例而言,由于其基本相似于方法實施例,所以描述得比較簡單,相關(guān)之處參見方法實施例的部分說明即可。以上所描述的裝置及系統(tǒng)實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。
以上所述,僅為本發(fā)明較佳的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)該以權(quán)利要求的保護范圍為準(zhǔn)。