一、 說明
本篇文章主要說一下MySQL數據中身份鑒別控制點中a測評項的相關知識點和理解。
二、 MySQL用戶
2.1. 用戶身份標識
MySQL數據庫對于用戶的標識和其她數據庫有些不一樣,不僅僅是用戶名,而是username + host。
MySQL數據中user表的一部分字段如下:
這三個用戶的用戶名雖然都是root,但其實是三個不同的用戶,其密碼也是單獨設置的。
查詢當前登錄賬戶,也可以看到用戶的標識組成為username+host:
2.2. 登錄匹配機制
既然用戶的標示是兩個字段的組合,匹配的時候也要這兩個字段都匹配上了才行,這里我簡單的說一說(根據官方文檔)。
當客戶端對MySQL發起連接后,MySQL會先對user表進行排序,然后從第一行開始,逐行與傳入的host、username進行匹配,當匹配到了某一行之后,就不往下繼續匹配了。(如果任何一行都無法匹配,則登錄失敗)
此時,再來對比傳入的口令和存儲的口令是否一致,如果口令一致,那么該行即為這次登陸后所使用的行(用戶身份)。
如果不一致,則登錄失敗。
舉個例子,如果用戶表如下所示:
那么當驗證時,會首先對其進行排序,排序如下:
注意,Host字段可以使用匹配符%,%則代表匹配任何Ip地址。另外,空字符串也代表匹配任何Ip地址。
而User字段不使用匹配符%,但是如果為空字符串,則代表匹配任何用戶名。
MySQL排序時是先對Host進行排序,然后才是User。
Host的排序為明確的值排在前面,比如文字主機名和IP地址即為明確的地址值,所以%和空字符串排在她們之后,其中空字符串又排在%之后。
當Host字段向同時,則對User字段進行排序,對于User字段也是明確的值排在前面,所以在排序結果圖中,root@localhost排在了@localhost(空字符串用戶名)的前面。
如果Host字段和User字段都一樣,那么排序的順序是不確定的(可能和創建該用戶的先后有關)。
所以客戶端連接MySQL數據庫時,使用給定的用戶名,不一定會以該用戶名的身份登入數據庫。
比如使用用戶名jeffrey和她的口令,在本地的mysql中進行登錄時,會按照排序結果圖中,一行行的去匹配:
對于第一行,客戶端的Host(localhost或者127.0.0.1)可以和Host字段的localhost匹配上,但是User不一樣,無法完全匹配,所以往下走。
對于第二行,客戶端的Host(localhost或者127.0.0.1)可以和Host字段的localhost匹配上,而第二行的用戶名是空字符串,可以匹配任何用戶名,所以也能匹配jeffrey,如果口令一致,則完成了匹配,到此匹配過程結束。
這樣,雖然使用了用戶名jeffrey,但最后卻會以@localhost的身份登入數據庫。
最后,User表的口令字段可以為空字符串,這代表口令為空字符串,而不是與任何口令都匹配。
2.3. 查詢當前用戶
MySQL中存在user()函數和current_user()函數。
user()函數會顯示你當前的登錄用戶具體是使用了什么用戶名和什么ip地址去進行登錄的。(注,ip地址是指連接數據庫的客戶端的ip地址,不是自己設置的值)
例子如下:
這里代表在ip地址為192.168.203.132的客戶端上,使用用戶名test對MySQL數據庫進行了連接。
current_user()函數會顯示你最終使用的用戶身份(也就是最后匹配到的那一行),例子如下:
也就是,最后在User表中匹配到了Host字段為192.168.%.%、User字段為test的那一行,以[email protected]..%.%的用戶身份登錄了MySQL數據庫。
2.4. 口令字段
在MySQL5.7之前,User表中的口令字段為Password,從MySQL5.7開始,口令字段變成了authentication_string。
不過在MySQL5.7之前,比如MySQL5.5.53,也存在著authentication_string字段,不知道其用途是什么。
三、測評項a
a)應對登錄的用戶進行身份標識和鑒別,身份標識具有唯一性,身份鑒別信息具有復雜度要求并定期更換;
3.1. 測評項要求1
應對登錄的用戶進行身份標識和鑒別
對于MySQL來說,如上文所言,用戶的身份標識為username + host,鑒別就是通過username + host + password來進行登錄驗證。
所以,對于這個要求,就是不能出現空用戶名、空密碼、任意host的用戶,也就是鑒別的因素三者同時皆空。
其中任何一個不為空或%(對Host而言),則都算實現了鑒別(部分鑒別)。
3.2. 測評項要求2
身份標識具有唯一性
對于MySQL來說,如上文所言,用戶的身份標識為username + host,MySQL并沒有禁止出現完全一樣的username + host行,所以這里是可能出現身份標識不唯一的情況的。