mysql空用戶(user列爲空)的陷阱

今天搭建一個測試環境時,遇到了一個很隱蔽的問題。有必要分享一下
| user | password                                  | host               |
+------+-------------------------------------------+--------------------+
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | localhost          |1
| root |                                           | db-2.photo.xxx.org |2
| root |                                           | 127.0.0.1          |3
| root |                                           | ::1                |4
|      |                                           | localhost          |5
|      |                                           | db-2.photo.xxx.org |6
| sys  | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    | db-2.photo.xxx.org |7
...
...
如上圖所示,這個裏面存在着兩個用戶名爲空的情況。然後問題就是由此而起。
在本機(服務器,db-2.photo.xxx.org) mysql -usys -ppass -h`hostname` 或者 mysql -usys -ppass -h`hostname -i` 都提示無法連接。此時配置文件裏面沒有 --skip-name-resolve這個參數(DNS解析用的)
而用戶表裏面明明有這個[email protected] 而且密碼也對了啊?起初沒有注意到這個空用戶,沒想到它的陷阱,搞了很久也沒連上,後來只好請老大了,老大過來一看,直接drop user ''@db-2.photo.xxx.org(刪掉這個空用戶,老大V5),然後再連,OK 搞定。
這是什麼原因呢?
因爲mysql在驗證權限的時候,首先是驗證host列,如果host列在驗證user列,再password列,而現在按照我之前的連接語句:按照host列首先找到第6行,然後發現這行的user列爲空(空匹配所有用戶名),所以匹配到了這條記錄,然後發現這條記錄的密碼爲空,而我的連接語句裏面有密碼,那麼就會報錯。
好了,你可能會說要是我在連接的時候 -h指定的是ip地址,而不是域名(db-2.photo.xxx.org)那麼不就不會匹配到了這條記錄麼?但是我在前面說了--skip-name-resolve這個參數我沒有指定,那麼就會DNS解析,將域名解析成IP地址。所以還是會被匹配到的。
於是我的連接語句改爲 mysql -usys  -h`hostname -i` 或者  mysql -usys  -h`hostname` 此時就可以連接成功,但是請注意,雖然可以連接成功,但是實際上這個連上去的用戶多大權限,也就是空用戶所具有的權限。
而且,我後來模擬的時候,將第6行的存放順序(物理磁盤上)和第7行反過來(這個可以通過optimize 一下table,然後順序插入兩條用戶記錄解決,雖然不能說絕對的成功,因爲插在磁盤上的哪個位置不是我們能控制的,但是除非你RP敗壞,可能會出現後插入的記錄在物理磁盤上反而在前面)然後再進行前面的連接測試  mysql -usys -ppass  -h`hostname -i` 或者  mysql -usys  -ppass -h`hostname`, ok沒問題了。同時如果將上面的連接語句去掉 -p選項,那麼就是密碼錯誤,也不會再去判斷第7行了(已經調換順序的第7行)
所以解決辦法就是:
1.剛裝好mysql後就直接刪除那個空用戶
2.連接的時候,-h+ip連接,且在配置文件裏面指定 --skip-name-resolve,這樣同時還能消除DNS解析帶來的性能影響
另外,如果直接指定了socket的話,也不會存在這個問題,此時連接就是通過socket,而不是tcp/ip。 同時,如果你在別的機器上連接肯定也沒問題,因爲空用戶默認的host就是主機地址。
不明白mysql5.5爲什麼這樣設計,在mysql5.1裏面就沒有這個空用戶。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章