安華金和數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品常見(jiàn)缺陷之參數(shù)審計(jì)錯(cuò)誤_第1頁(yè)
安華金和數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品常見(jiàn)缺陷之參數(shù)審計(jì)錯(cuò)誤_第2頁(yè)
安華金和數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品常見(jiàn)缺陷之參數(shù)審計(jì)錯(cuò)誤_第3頁(yè)
安華金和數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品常見(jiàn)缺陷之參數(shù)審計(jì)錯(cuò)誤_第4頁(yè)
安華金和數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品常見(jiàn)缺陷之參數(shù)審計(jì)錯(cuò)誤_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品常見(jiàn)缺陷之(五)參數(shù)審計(jì)錯(cuò)誤參數(shù)綁定是數(shù)據(jù)庫(kù)編程中常用的一種方法,通過(guò)這種方法,數(shù)據(jù)庫(kù)系統(tǒng)可以減少編譯次數(shù),快速執(zhí)行,提升效率;但這種編程方法將對(duì)數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品帶來(lái)挑戰(zhàn),在筆者所見(jiàn)到的若干數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品中,在這種情況下都出了不少的錯(cuò)誤。有的是漏審了語(yǔ)句,有的是記錄下了操作的語(yǔ)句,但將具體執(zhí)行時(shí)所使用的參數(shù)記錯(cuò)了或漏記了。這些缺陷對(duì)于審計(jì)產(chǎn)品無(wú)疑很是致命。為了詳解這種情況,我們來(lái)看一下參數(shù)綁定的基本概念。我們?cè)诔R?guī)的圖形化或命令行工具中,往往都是直接寫上SQL語(yǔ)句,比如:Select * from person_info where id=12XXXXX6722;在這里查詢條件是身

2、份證號(hào)碼。根據(jù)身份證號(hào)碼查詢個(gè)人信息,是一種常用功能,也是會(huì)重復(fù)使用的語(yǔ)句,為了提升效率,編程中可以這么寫:String sql1=Select * from person_info where id=?;PreparedStatement pStmt = testConn.getConnection().prepareStatement(sql);pStmt.setInt(1, 12XXXXX6722);pStmt.execute();下一次再使用時(shí),就不用再發(fā)送語(yǔ)句了,可以直接發(fā)送:pStmt.setInt(1, 22XXXXX5399);pStmt.execute();對(duì)于數(shù)據(jù)庫(kù)審計(jì)系統(tǒng)

3、而言,單純地記錄下來(lái)Select * from person_info where id=?是存在缺陷的,因?yàn)槟銦o(wú)法明確額操作人員到底訪問(wèn)了哪個(gè)用戶的信息,必須明確下來(lái)具體的參數(shù)才行。這就要求將設(shè)定的參數(shù),與Prepare的語(yǔ)句有效的關(guān)聯(lián),形成可視化的審計(jì)記錄展現(xiàn):Select * from person_info where id=12XXXXX6722;Select * from person_info where id=22XXXXX5399;這實(shí)際上要求數(shù)據(jù)庫(kù)審計(jì)系統(tǒng)比起單純的記錄語(yǔ)句要完成更多的工作;其中一個(gè)重要任務(wù)的就是句柄追蹤,本質(zhì)上SQL語(yǔ)句的執(zhí)行過(guò)程追蹤就是句柄追蹤過(guò)程。在上

4、面顯示的例子中,pStmt.execute(),在通訊過(guò)程中并不發(fā)送具體的語(yǔ)句,而僅是告知服務(wù)器要執(zhí)行哪個(gè)語(yǔ)句句柄,服務(wù)器端會(huì)根據(jù)內(nèi)部記錄的句柄所對(duì)應(yīng)的已經(jīng)編譯完成的SQL語(yǔ)句的執(zhí)行計(jì)劃,進(jìn)行語(yǔ)句執(zhí)行。數(shù)據(jù)庫(kù)審計(jì)要完成相應(yīng)的工作,需要執(zhí)行類似的過(guò)程,在系統(tǒng)的內(nèi)部也維護(hù)這樣的映射關(guān)系;同時(shí)由于大多數(shù)數(shù)據(jù)庫(kù)的句柄,是在會(huì)話級(jí)的,句柄是可重用的,因此在數(shù)據(jù)庫(kù)審計(jì)中還要有效地維護(hù)句柄與session的關(guān)聯(lián),以及句柄的消亡。在句柄維護(hù)之外,對(duì)于數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品另一個(gè)有挑戰(zhàn)的工作就是參數(shù)的還原。參數(shù)的還原,首要的是要明確參數(shù)所對(duì)應(yīng)的句柄;在調(diào)用pStmt.setInt(1, 22XXXXX5399)時(shí),在網(wǎng)

5、絡(luò)中發(fā)送的包,會(huì)標(biāo)明這個(gè)參數(shù)是針對(duì)哪個(gè)句柄的,是針對(duì)第幾個(gè)參數(shù)的。作為數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品,需要將參數(shù)與語(yǔ)句進(jìn)行映射;更重要地要準(zhǔn)確地填回參數(shù)所在的位置,上面這個(gè)例子由于只有一個(gè)參數(shù),沒(méi)有什么挑戰(zhàn)性。但參數(shù)的綁定情況遠(yuǎn)比這個(gè)復(fù)雜,下面我們將提供一些例子來(lái)考驗(yàn)相關(guān)的數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品。用例1:一個(gè)基本的示例String sql = select PID,NAME from PERFORMANCE_C t where pid=:1 and balance:2 and persionid:3 and datefieldTO_DATE(:4,YYYY-MM-DD);PreparedStatementpStmt_

6、2 = testConn.getConnection().prepareStatement(sql);pStmt_2.setInt(1, 84);pStmt_2.setInt(2, 5555);pStmt_2.setString(3, 120);pStmt_2.setString(4, 1900-1-1);pStmt_2.execute();在這個(gè)示例中關(guān)鍵是看數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品是否能將語(yǔ)句審計(jì)為:select PID,NAME from PERFORMANCE_C t where pid=84 and balance5555 and persionid120 and datefieldTO_DA

7、TE(1900-1-1,YYYY-MM-DD)用例2:這是一個(gè)略有挑戰(zhàn)的例子,但這個(gè)挑戰(zhàn)已經(jīng)有數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品無(wú)法將參數(shù)還原了String sql = select PID,NAME from PERFORMANCE_C t where pid=:pid and balance:balance and personid:personid and datefieldTO_DATE(:datefield,YYYY-MM-DD);PreparedStatementpStmt_2 = testConn.getConnection().prepareStatement(sql);pStmt_2.setIn

8、t(1, 84);pStmt_2.setInt(2, 5555);pStmt_2.setString(3, 120);pStmt_2.setString(4, 1900-1-1);pStmt_2.execute();這里的挑戰(zhàn)在于參數(shù)并未使用常規(guī)的?號(hào)或者:1,這樣的方式,而是采用了字符串的方式;驗(yàn)證的答案依然是:select PID,NAME from PERFORMANCE_C t where pid=84 and balance5555 and personid120 and datefieldTO_DATE(1900-1-1,YYYY-MM-DD)用例3:這個(gè)挑戰(zhàn)同樣有數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品出

9、錯(cuò)了String sql = select PID,NAME from PERFORMANCE_C t where personid:1 and pid=:2 and balance:3 and personid120 and pid=84 and balance5555 and personid :1 and personid =:2 and content like Name:3% and balance:3;PreparedStatementpStmt_2 = testConn.getConnection().prepareStatement(sql);pStmt_2.setInt(1,

10、 84);pStmt_2.setString (2, 120);pStmt_2.setString (3, 5555);pStmt_2.execute();驗(yàn)證的答案是:select PID,NAME from PERFORMANCE_C t where personid120 and pid=84 and content like Name:3% and balance5555;用例5:這個(gè)挑戰(zhàn)是驗(yàn)證數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品對(duì)于多prepared語(yǔ)句下是否能準(zhǔn)確地將執(zhí)行的語(yǔ)句和對(duì)應(yīng)的參數(shù)都審計(jì)下來(lái),這里我們將提供兩條語(yǔ)句進(jìn)行交互的執(zhí)行:public void TestCase_PrepareSelec

11、t_3()String sql_1 = select pid,balance,account from F10_USER t where pid=:pid;/String sql_2 = select NAME,PID,balance from PERFORMANCE_C t where pid=:1 and balance:2 and persionid:3 and datefieldTO_DATE(:4,YYYY-MM-DD);String sql_2 = select NAME,PID,balance from F10_USER t where pid=:1 and balance:3

12、and persionid:2 and datefieldTO_DATE(:4,YYYY-MM-DD);try pStmt = testConn.getConnection().prepareStatement(sql_1);pStmt_2 = testConn.getConnection().prepareStatement(sql_2);/第一輪執(zhí)行pStmt_2.setInt(1, 94);pStmt_2.setInt(2, 5555);pStmt_2.setString(3, 120);pStmt_2.setString(4, 1900-1-1);pStmt_2.execute();t

13、estRest_2 = pStmt_2.getResultSet();while(testRest_2.next()pid = testRest_2.getInt(PID);System.out.println(PID=+pid);pStmt.setInt(1, 84);pStmt.execute();testRest = pStmt.getResultSet();while(testRest.next()pid = testRest.getInt(PID);System.out.println(PID=+pid);/第2輪執(zhí)行pStmt.setInt(1, 85);pStmt.execute

14、();testRest = pStmt.getResultSet();while(testRest.next()pid = testRest.getInt(PID);System.out.println(PID=+pid);pStmt_2.setInt(1, 95);pStmt_2.setInt(2, 1555);pStmt_2.setString(3, 1305);pStmt_2.setString(4, 1920-1-1);pStmt_2.execute();testRest_2 = pStmt_2.getResultSet();while(testRest_2.next()pid = t

15、estRest_2.getInt(PID);System.out.println(PID=+pid);/第3輪執(zhí)行pStmt_2.setInt(1, 96);pStmt_2.setInt(2, 5123);pStmt_2.setString(3, 1201);pStmt_2.setString(4, 1930-1-1);pStmt_2.execute();testRest_2 = pStmt_2.getResultSet();while(testRest_2.next()pid = testRest_2.getInt(PID);System.out.println(PID=+pid);pStm

16、t.setInt(1, 86);pStmt.execute();testRest = pStmt.getResultSet();while(testRest.next()pid = testRest.getInt(PID);System.out.println(PID=+pid);/testRest.close();/pStmt.close(); catch (SQLException e) e.printStackTrace();應(yīng)該來(lái)講,這是一個(gè)并不復(fù)雜的多語(yǔ)句執(zhí)行示例,但某知名廠商的數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品,將sql_1被審計(jì)到了4次,sql_2被審計(jì)到了1次。這僅僅是一種簡(jiǎn)單的多語(yǔ)句執(zhí)行情況,我

17、們現(xiàn)實(shí)中的應(yīng)用要更為復(fù)雜。大家可以訪問(wèn)這個(gè)鏈接,該鏈接將提供更為一個(gè)完整的參數(shù)綁定示例;我們可以測(cè)測(cè)所使用的數(shù)據(jù)庫(kù)審計(jì)產(chǎn)品能否準(zhǔn)確審計(jì):/a/shujukuanquan/shujukufanghushouduan/shujukushenj/index.html。下面我們不再對(duì)這些簡(jiǎn)單的情況進(jìn)行討論,我們將討論一種更為復(fù)雜的參數(shù)綁定情況,也就是批量參數(shù)綁定對(duì)于數(shù)據(jù)庫(kù)審計(jì)產(chǎn)片的挑戰(zhàn)。批量參數(shù)綁定是DBMS提供商為了提供更為高效的數(shù)據(jù)操作速度,而提供的一批參數(shù)發(fā)送,語(yǔ)句多次執(zhí)行;該方式通過(guò)更少的網(wǎng)絡(luò)通訊次數(shù)、更少的SQL層的語(yǔ)境切換等大幅度提高編程效率。這種執(zhí)行方

18、式在一般的編程中很少使用,但在類似于電信運(yùn)營(yíng)商的計(jì)費(fèi)系統(tǒng)這樣的環(huán)境,對(duì)性能的要求很高,往往需要每秒接近上萬(wàn)條的插入或更新,則是一種較為常見(jiàn)的使用方式;因此對(duì)于運(yùn)行商、證券金融、互聯(lián)網(wǎng)這樣的瞬時(shí)交易量非常大,需要采用最為高效的數(shù)據(jù)處理方式的應(yīng)用環(huán)境需要對(duì)這種參數(shù)綁定方式兼容。下面是一個(gè)批量插入的示例,僅僅是為了檢驗(yàn)審計(jì)產(chǎn)品是否支持該功能:PreparedStatement statement = connection.prepareStatement(INSERT INTO Tbl1 VALUES(?, ?);/記錄1statement.setInt(1, 1);statement.setString(2, Cujo);statement.addBatch();/記錄2statement.setInt(1, 2);statement.setString(2, Fred);statement.addBatch();/記錄3statement.setInt(1, 3);sta

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論