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