Du har förmodligen en anonym användare ''@'localhost'
eller ''@'127.0.0.1'
.
Enligt handboken :
När flera matchningar är möjliga måste servern bestämma vilken av dem som ska användas. Det löser problemet enligt följande:(...)
- När en klient försöker ansluta, tittar servern igenom raderna [i tabellen mysql.user] i sorterad ordning.
- Servern använder den första raden som matchar klientens värdnamn och användarnamn.
(...)Servern använder sorteringsregler som ordnar rader med de mest specifika värdvärdena först .Literal värdnamn [som 'localhost'] och IP-adresser är de mest specifika.
Därför skulle en sådan anonym användare "maskera" vilken annan användare som helst som '[any_username]'@'%'
när du ansluter från localhost
.
'bill'@'localhost'
matchar 'bill'@'%'
, men skulle matcha (t.ex.) ''@'localhost'
i förväg.
Den rekommenderade lösningen är att släppa denna anonyma användare (detta är vanligtvis en bra sak att göra ändå).
Redigeringarna nedan är för det mesta irrelevanta för huvudfrågan. Dessa är endast avsedda att svara på några frågor som ställts i andra kommentarer i den här tråden.
Redigera 1
Autentiseras som 'bill'@'%'
genom ett uttag.
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock Welcome to the MySQL monitor (...) mysql> SELECT user, host FROM mysql.user; +------+-----------+ | user | host | +------+-----------+ | bill | % | | root | 127.0.0.1 | | root | ::1 | | root | localhost | +------+-----------+ 4 rows in set (0.00 sec) mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | [email protected] | [email protected]% | +----------------+----------------+ 1 row in set (0.02 sec) mysql> SHOW VARIABLES LIKE 'skip_networking'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | skip_networking | ON | +-----------------+-------+ 1 row in set (0.00 sec)
Redigera 2
Exakt samma inställning, förutom att jag återaktiverade nätverket, och jag skapar nu en anonym användare ''@'localhost'
.
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql Welcome to the MySQL monitor (...) mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass'; Query OK, 0 rows affected (0.00 sec) mysql> Bye [email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ --socket=/tmp/mysql-5.5.sock ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES) [email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -h127.0.0.1 --protocol=TCP ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES) [email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \ -hlocalhost --protocol=TCP ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Redigera 3
Samma situation som i edit 2, anger nu den anonyma användarens lösenord.
[email protected]:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost Welcome to the MySQL monitor (...) mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | [email protected] | @localhost | +----------------+----------------+ 1 row in set (0.01 sec)
Slutsats 1, från redigering 1:Man kan autentisera som 'bill'@'%'
genom ett uttag.
Slutsats 2, från redigering 2:Huruvida man ansluter via TCP eller via en socket har ingen inverkan på autentiseringsprocessen (förutom att man inte kan ansluta som någon annan än 'something'@'localhost'
genom ett uttag, uppenbarligen).
Slutsats 3, från redigering 3:Även om jag angav -ubill
, jag har fått åtkomst som anonym användare. Detta beror på "sorteringsreglerna" som rekommenderas ovan. Observera att i de flesta standardinstallationer, ett lösenord utan lösenord, anonymt användare finns
(och bör säkras/ta bort).