如何最好地編寫位於通用SQL數據庫(SQL Server,MySQL,Oracle等)之前的應用程序並偵聽SQL查詢?通用SQL查詢偵聽器
應用程序需要根據特定查詢類型攔截(阻止傳遞到SQL數據庫)或傳遞(發送到SQL數據庫)查詢。
有沒有辦法做到這一般,以便它不綁定到特定的數據庫後端?
如何最好地編寫位於通用SQL數據庫(SQL Server,MySQL,Oracle等)之前的應用程序並偵聽SQL查詢?通用SQL查詢偵聽器
應用程序需要根據特定查詢類型攔截(阻止傳遞到SQL數據庫)或傳遞(發送到SQL數據庫)查詢。
有沒有辦法做到這一般,以便它不綁定到特定的數據庫後端?
基本的系統並不是特別容易,但它也不是很難。您創建一個監聽端口(或一組端口)的連接嘗試的守護進程。它接受這些連接,然後與DBMS建立自己的連接,形成一箇中間人中繼/攔截點。主要的問題是如何配置的東西,使:
雖然您仍然可能遇到問題。最值得注意的是,如果GSL與DBMS監聽器位於同一臺機器上,那麼當GSL連接到DBMS時,它會像本地連接而不是遠程連接一樣查看DBMS。如果GSL位於不同的機器上,則看起來所有連接都來自GSL正在運行的機器。
此外,如果信息正在發送加密,那麼您的GSL只能攔截加密通信。如果加密是好的,你將無法記錄它。你可能能夠處理Diffie-Hellman交換,但是你需要知道你在做什麼,以及你正在截取的數據庫管理系統是什麼 - 你可能需要從客戶端買入他們會通過你的中間人系統。當然,如果'客戶'是你控制下的網絡服務器,你可以處理所有這些。
只要您的代碼只是傳輸和記錄查詢,連接的細節往往是足夠直接的。每個DBMS都有自己的協議來處理SQL請求,攔截和修改或拒絕操作需要了解每個DBMS的協議。
有商業產品做這種事情。我爲IBM工作,並且知道IBM的Guardium產品包含了許多DBMS的能力(包括我相信,上述所有內容 - 如果存在問題,可能是支持最少的MySQL)。處理加密通信仍然非常棘手,即使對於Guardium等系統也是如此。
我有一個守護進程,它運行在Unix上,適用於一個特定的DBMS。它處理大部分 - 但不會干擾加密通信;它只是記錄兩個最終派對對彼此說的話。聯繫我,如果你想要的代碼 - 請參閱我的個人資料。許多部分可能會與其他DBMS重用;其他部分完全是針對其設計的特定DBMS特有的。
提及Guardium是我第一次想到的+1。 – cairnz
感謝您的好消息。 –
你所描述的內容聽起來確實很難做到。你能解釋幾個攔截SQL查詢的用例嗎?也許有一個更簡單的方法。 –
嗯,我在想我們的應用程序可能會在端口上偵聽SQL查詢,如果不攔截,只能將查詢轉發到SQL數據庫正在偵聽的端口。基本用例只是一個「SQL查詢過濾器」,它可以禁用除SQL數據庫以外的特定查詢 – user1853046
單獨監聽MS SQL服務器的端口,因爲它可以配置爲使用動態端口(更改每次開始)。爲什麼不使用標準安全功能來禁用特定查詢? –