作者:雲舒
What is MySQL Proxy?
MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; failover; query analysis; query filtering and modification; and many more. 可以看到,MySQL Proxy的主要作用是用來做負載平衡,資料庫讀寫分離的。但是需要注意的是,MySQL Proxy還有個強大的擴充功能就是支援Lua語言——魔獸也是使用了Lua來開發遊戲,據我所知網易也是——可以參見雲風的部落格。這樣一種擴充,就給了我讓他做別的事情的思路——防止注入攻擊。
啟動MySQL Proxy的時候,載入一個Lua指令碼,對每一個進入的query或者insert之類的語句做一次安全檢查,甚至替換查詢中的某些內容,這樣在程式員的 程式中忘記了過濾參數的情況下,還有最後一道防線可用。而且由於是Lua這樣的動態指令碼語言,在開發,修正,部署方面都會有極大的靈活性。當然,或許會擔 心效能方面的問題,那麼在前面加memcached吧,或者乾脆用c來寫這樣的擴充,畢竟MySQL Proxy是開源的,而且有清晰的介面。
MySQL Proxy提供給Lua的介面主要有以下幾個函數:
connect_server() — 這個函數每次client串連的時候被調用,可以用這個函數來處理負載平衡,決定當前的請求發給那個背景伺服器,如果沒有指定這個函數,那麼就會採用簡單的輪詢機制。
read_handshake() — 這個函數在server返回初始握手資訊時被調用,可以調用這個函數在驗證資訊發給伺服器前進行額外的檢查。
read_auth() — client發送驗證資訊給伺服器的時候會調用這個函數。
read_auth_result() — 伺服器驗證資訊返回後調用這個函數。
read_query() — 每次client發送查詢請求函數的時候被調用,可以用這個函數進行查詢語句的預先處理,過濾掉非預期的查詢等等,這個是最常用的函數。
read_query_result() — 查詢結果返回是調用的函數,可以進行結果集處理。
可以看到,自由發揮之後還是有很多其它的事情可以做的。不知道現在有沒有公司這麼做,或者說做過這方面的嘗試。我只是寫一個小思路,可行不可行, 等以後再去檢驗吧。最近牙疼的厲害,唉,小時候不注意,現在治療保護都來不及了。以後有了自己的寶寶,我會吸取教訓的,呵呵,與君共勉。