MySQL Proxy(解決注入的另一思路)
更新時間:2008年06月06日 12:02:00 作者:
MySQL Proxy的主要作用是用來做負載均衡,數(shù)據(jù)庫讀寫分離的。但是需要注意的是,MySQL Proxy還有個強大的擴展功能就是支持Lua語言——魔獸也是使用了Lua來開發(fā)游戲,據(jù)我所知網(wǎng)易也是——可以參見云風的博客。
作者:云舒
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的主要作用是用來做負載均衡,數(shù)據(jù)庫讀寫分離的。但是需要注意的是,MySQL Proxy還有個強大的擴展功能就是支持Lua語言——魔獸也是使用了Lua來開發(fā)游戲,據(jù)我所知網(wǎng)易也是——可以參見云風的博客。這樣一種擴展,就給了我讓他做別的事情的思路——防止注入攻擊。
啟動MySQL Proxy的時候,加載一個Lua腳本,對每一個進入的query或者insert之類的語句做一次安全檢查,甚至替換查詢中的某些內(nèi)容,這樣在程序員的 程序中忘記了過濾參數(shù)的情況下,還有最后一道防線可用。而且由于是Lua這樣的動態(tài)腳本語言,在開發(fā),修正,部署方面都會有極大的靈活性。當然,或許會擔 心性能方面的問題,那么在前面加memcached吧,或者干脆用c來寫這樣的擴展,畢竟MySQL Proxy是開源的,而且有清晰的接口。
MySQL Proxy提供給Lua的接口主要有以下幾個函數(shù):
connect_server() — 這個函數(shù)每次client連接的時候被調(diào)用,可以用這個函數(shù)來處理負載均衡,決定當前的請求發(fā)給那個后臺的服務器,如果沒有指定這個函數(shù),那么就會采用簡單的輪詢機制。
read_handshake() — 這個函數(shù)在server返回初始握手信息時被調(diào)用,可以調(diào)用這個函數(shù)在驗證信息發(fā)給服務器前進行額外的檢查。
read_auth() — client發(fā)送驗證信息給服務器的時候會調(diào)用這個函數(shù)。
read_auth_result() — 服務器驗證信息返回后調(diào)用這個函數(shù)。
read_query() — 每次client發(fā)送查詢請求函數(shù)的時候被調(diào)用,可以用這個函數(shù)進行查詢語句的預處理,過濾掉非預期的查詢等等,這個是最常用的函數(shù)。
read_query_result() — 查詢結果返回是調(diào)用的函數(shù),可以進行結果集處理。
可以看到,自由發(fā)揮之后還是有很多其它的事情可以做的。不知道現(xiàn)在有沒有公司這么做,或者說做過這方面的嘗試。我只是寫一個小思路,可行不可行, 等以后再去檢驗吧。最近牙疼的厲害,唉,小時候不注意,現(xiàn)在治療保護都來不及了。以后有了自己的寶寶,我會吸取教訓的,呵呵,與君共勉。
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的主要作用是用來做負載均衡,數(shù)據(jù)庫讀寫分離的。但是需要注意的是,MySQL Proxy還有個強大的擴展功能就是支持Lua語言——魔獸也是使用了Lua來開發(fā)游戲,據(jù)我所知網(wǎng)易也是——可以參見云風的博客。這樣一種擴展,就給了我讓他做別的事情的思路——防止注入攻擊。
啟動MySQL Proxy的時候,加載一個Lua腳本,對每一個進入的query或者insert之類的語句做一次安全檢查,甚至替換查詢中的某些內(nèi)容,這樣在程序員的 程序中忘記了過濾參數(shù)的情況下,還有最后一道防線可用。而且由于是Lua這樣的動態(tài)腳本語言,在開發(fā),修正,部署方面都會有極大的靈活性。當然,或許會擔 心性能方面的問題,那么在前面加memcached吧,或者干脆用c來寫這樣的擴展,畢竟MySQL Proxy是開源的,而且有清晰的接口。
MySQL Proxy提供給Lua的接口主要有以下幾個函數(shù):
connect_server() — 這個函數(shù)每次client連接的時候被調(diào)用,可以用這個函數(shù)來處理負載均衡,決定當前的請求發(fā)給那個后臺的服務器,如果沒有指定這個函數(shù),那么就會采用簡單的輪詢機制。
read_handshake() — 這個函數(shù)在server返回初始握手信息時被調(diào)用,可以調(diào)用這個函數(shù)在驗證信息發(fā)給服務器前進行額外的檢查。
read_auth() — client發(fā)送驗證信息給服務器的時候會調(diào)用這個函數(shù)。
read_auth_result() — 服務器驗證信息返回后調(diào)用這個函數(shù)。
read_query() — 每次client發(fā)送查詢請求函數(shù)的時候被調(diào)用,可以用這個函數(shù)進行查詢語句的預處理,過濾掉非預期的查詢等等,這個是最常用的函數(shù)。
read_query_result() — 查詢結果返回是調(diào)用的函數(shù),可以進行結果集處理。
可以看到,自由發(fā)揮之后還是有很多其它的事情可以做的。不知道現(xiàn)在有沒有公司這么做,或者說做過這方面的嘗試。我只是寫一個小思路,可行不可行, 等以后再去檢驗吧。最近牙疼的厲害,唉,小時候不注意,現(xiàn)在治療保護都來不及了。以后有了自己的寶寶,我會吸取教訓的,呵呵,與君共勉。
相關文章
google hack dat 又增加的一些比較新的數(shù)據(jù)
google hack dat 又增加的一些比較新的數(shù)據(jù)2007-01-01當備份數(shù)據(jù)庫不能用時.用郵件列表得到WEBSHELL!(圖)
當備份數(shù)據(jù)庫不能用時.用郵件列表得到WEBSHELL!(圖)...2007-01-01