【原創】MySQL Proxy - 腳本

15.7.4. MySQL Proxy Scripting

(下面這些章節能夠參考後面的譯文)
15.7.4.1. Proxy Scripting Sequence During Query Injection
15.7.4.2. Internal Structures
15.7.4.3. Capturing a Connection with connect_server()
15.7.4.4. Examining the Handshake with read_handshake()
15.7.4.5. Examining the Authentication Credentials with read_auth()
15.7.4.6. Accessing Authentication Information with read_auth_result()
15.7.4.7. Manipulating Queries with read_query()
15.7.4.8. Manipulating Results with read_query_result()


       你能夠經過使用嵌入式 Lua 腳本語言對 MySQL Proxy 的行爲進行控制,以使得其可以對發送給 MySQL 服務器的 query 和 response 進行操縱。


下圖展示了 MySQL Proxy 中使用的類的總覽。




       在 MySQL Proxy 和服務器之間的主要交互功能是經過 Lua 腳本定義的一個或者多個函數。根據客戶端與一個或者多個 backend MySQL servers 之間通訊序列中不一樣的事件和操做,定義以下一些關鍵函數:


connect_server(): 該函數在每次有來自客戶端到 MySQL Proxy 的鏈接發生時被調用。你能夠在作負載均衡(load-balancing)功能時使用該函數以攔截原始鏈接,而後再經過策略決定客戶端將要鏈接的服務器。若是你沒有定義一個肯定方案,默認狀況下,一個簡單的輪詢(round-robin)類型的分發方式將被採用。


read_handshake(): 該函數在初始握手信息被服務器返回時被調用。你能夠捕獲返回的握手信息,而後在受權交換(authorization exchange)發生前提供額外的檢查。


read_auth(): 該函數在受權包(用戶名,密碼,默認數據庫)被客戶端提交給服務器用於鑑權時被調用。


read_auth_result(): 該函數在收到服務器返回的將要發送給客戶端代表是否受權成功的受權包時被調用。


read_query(): 該函數在每次客戶端向服務器發送 query 時被調用。可使用該函數對原始的 query 進行編輯和操縱,包括在原始 query 的前面和後面添加新的 query 。一樣可使用該函數直接返回信息給客戶端而不通過(bypassing)服務器,該功能在打算過濾掉不指望的 query 的時候或者 query 的數量超過了已有限制的狀況下頗有用。


read_query_result(): 該函數在每次有結果從服務器返回的時候被調用,前提是你手動注入了 query 到 query 隊列中。若是你沒有顯示地在 read_query() 中注入 query ,則該函數不會被觸發。可使用該函數對結果集進行編輯,或者移除、過濾結果集的內容,只要該內容是因爲你在 read_query() 中注入的額外的 query 產生的結果。


下表中列出了 MySQL proxy 和服務器的通訊函數,提供的信息,以及當函數被觸發時的信息流方向。


Function              Supplied Information        Direction
connect_server()          None                       Client to Server
read_handshake()        None                      Server to Client
read_auth()                  None                       Client to Server
read_auth_result()        None                      Server to Client
read_query()                 Query                     Client to Server
read_query_result()      Query result           Server to Client


       默認狀況下,全部的函數都會返回結果以代表當前數據是否要傳遞給客戶端或者服務器(取決於被傳輸的信息的方向)。返回值能夠經過顯示地返回一個常量的方式進行覆蓋,以代表應該發送某個特定的應答。例如,一種可能的狀況是,在 read_query() 中手動建立結果集,而後直接返回給客戶端,中間再也不涉及發送原始 query 到服務器的動做。


       除了上述這些函數,還有一些內置結構 經過提供針對元素的簡化了的接口,例如 query 的列表和結果集的分組,提供了對 MySQL Proxy 如何轉發 query 以及返回結果集的控制。
相關文章
相關標籤/搜索