如果我允許一組用戶將"explain $whatever"
提交給mysql(通過Perl的DBI使用DBD::mysql
),是否有任何用戶可以將任何數據庫更改,泄漏不重要的信息,甚至導致重大數據庫負載?如果是這樣,怎麼樣?在mysql中,「解釋...」總是安全嗎?
我知道,通過"explain $whatever"
一個可以找出表/列存在什麼(你必須猜測的名字,雖然)和大約多少條記錄在一個表或多少記錄有一個索引字段中的特定值。我不希望一個人能夠獲得有關未索引字段內容的任何信息。
DBD::mysql
不應該允許多個語句,所以我不期望它有可能運行任何查詢(只是解釋一個查詢)。即使子查詢不應該執行,只是解釋。
但我不是一個mysql專家,並且肯定有我甚至沒有意識到的mysql特性。
在試圖提出一個查詢計劃時,優化程序可能會真正執行一個表達式,以便拿出索引字段將與之進行比較的值。
explain select * from atable where class = somefunction(...)
其中atable.class
被索引,而不是唯一的,class='unused'
會發現沒有任何記錄,但class='common'
會發現一百萬條記錄。可能'解釋'評估somefunction(...)
?然後可以編寫somefunction(...)
以修改數據嗎?
可能它是安全的,但我不會這樣做;)任何有理由與`explain`混淆的人應該被給予DB和mysql CLI的測試副本。任何不需要測試數據庫的人都應該從寫入查詢中保存,因此不需要`explain`;) – hobbs 2011-01-09 08:55:11