關於複雜存儲過程中昂楷審計能力剖析

昂楷科技 發佈 2022-09-28T05:00:53.287997+00:00

什麼是存儲過程存儲過程是SQL語句和控制語句的預編譯集合,保存在資料庫里,可由應用程式調用執行,而且允許用戶聲明變量、邏輯控制語句及其他強大的編程功能。存儲過程可以接受輸入參數,並可具有輸出參數,還可以返回單個或多個結果集。

什麼是存儲過程

存儲過程是sql語句和控制語句的預編譯集合,保存在資料庫里,可由應用程式調用執行,而且允許用戶聲明變量、邏輯控制語句及其他強大的編程功能。存儲過程可以接受輸入參數,並可具有輸出參數,還可以返回單個或多個結果集。

_

存儲過程的優點

1)允許模塊化程序設計

只需創建一次存儲過程並將其存儲在資料庫中,以後就可以在應用程式中任意調用該存儲過程。存儲過程可由在資料庫編程方面有專長的人員創建,並可獨立於程序代碼而單獨修改。

2)改善性能

如果某操作需要大量的SQL語句或需要重複執行,則用存儲過程比每次直接執行SQL語句的速度要快。因為資料庫管理系統是在創建存儲過程時對SQL代碼進行分析和優化,並在第一次執行時進行語法檢查和編譯,將編譯好的可執行代碼存儲在內存的一個專門緩衝區中,以後再執行此存儲過程時,只需直接執行內存中的可執行代碼即可。

3)減少網絡流量

一個需要數百行SQL代碼完成的操作現在只需要一條執行存儲過程的代碼即可實現,因此,不再需要在網絡中傳送大量的代碼。

4)可作為安全機制使用

對於即使沒有直接執行存儲過程中的語句權限的用戶,也可以授予他們執行該存儲過程的權限。

_

存儲過程語法示例

CREATE OR REPLACE

PROCEDURE name [ (parameter [,parameter,…] ) ] IS //或AS

[說明:變量定義於此]

BEGIN

執行語句序列

[EXCEPTION

例外處理程序

END [name ];

用戶通過create or repalce語句可以建立存儲於伺服器端的存儲過程。存儲過程不能用於sql語句。(Procedures cannot be used in SQLstatements;)

Procedure有0或多個參數,參數可是(IN), output (OUT), (IN OUT)

類型.

執行存儲過程

set serveroutputon

直接執行:

execute my_testproc

exec my_testproc

存儲過程里要返回一個結果集,就必須要用到游標。那麼什麼是游標呢?簡而言之,SQL語句返回的結果通常為數據集,而游標可以在此基礎上,像一個指針一樣,對某些行結果進行處理。

適用場景

1)某些場景下,針對SELECT返回的集合,需要進行逐行讀取,或者針對行數據進行某些操作。

2)在某些交互式程序中,集合不能作為有效的處理單元,這時候需要有針對的逐行或者部分進行處理。

_

存儲過程審計的難點

審計類產品是基於旁路流量鏡像進行工作的,需要抓取網絡中資料庫的流量進行解析還原,前面有講到存儲過程的優點有一條是減少網絡流量,執行存儲過程在網絡傳輸的只是存儲過程的名稱和參數,具體的存儲過程封裝的SQL內容實際是在伺服器本地執行的,沒有相應的流量,所以只能審計到執行存儲過程的動作,不能抓取到SQL,目前是業界難題。

_

複雜存儲過程審計能力實踐

昂楷某客戶的業務系統使用大量存儲過程語法,SQL翻譯效果不直觀,影響可讀性,昂楷迎難而上,攻克了針對存儲過程深度解析的難題,提取出存儲過程的參數和值,重點是從存儲過程中審計出藥品相關的值,並配合翻譯功能,展現可讀性較好的中文描述信息。

翻譯效果:用戶[李明X] IP為[192.168.100.32]計算機用戶名[Administrator] 上調用了[西藥庫藥品明細帳查詢]窗口, 查詢內容是{藥房:西藥庫;項目:注射用艾普拉唑鈉; 出入庫類型:採購入庫;至:

to_date(『2022-05-01 00:00:00』,』yyyy/mm/dd hh24:mi:ss』),至:

to_date(『2022-05-15 00:00:00』,』yyyy/mm/dd hh24:mi:ss』),}

昂楷審計產品(資料庫審計、防統方)能夠對SQL Server、Oracle、DB2、Sybase、MySQL 等資料庫進行審計,審計的行為包括DDL、DML、DCL以及其它操作等行為。

審計的內容可以細化到庫、表、記錄、用戶、存儲過程、函數、游標、調用參數等等。檢驗一款資料庫審計產品的標準,不僅要能滿足常規的SQL審計,還要能滿足複雜SQL,如存儲過程、綁定變量、嵌套語句、函數、超長語句、腳本的審計,這樣才能做到真正的完整審計。

關鍵字: