Du har sandsynligvis en anonym bruger ''@'localhost'
eller ''@'127.0.0.1'
.
I henhold til manualen :
Når flere matches er mulige, skal serveren bestemme, hvilken af dem der skal bruges. Det løser dette problem som følger:(...)
- Når en klient forsøger at oprette forbindelse, ser serveren gennem rækkerne [af tabellen mysql.user] i sorteret rækkefølge.
- Serveren bruger den første række, der matcher klientens værtsnavn og brugernavn.
(...)Serveren bruger sorteringsregler, der sorterer rækker med de mest specifikke værtsværdier først .Literale værtsnavne [såsom 'localhost'] og IP-adresser er de mest specifikke.
Derfor ville en sådan anonym bruger "maske" enhver anden bruger som '[any_username]'@'%'
når du opretter forbindelse fra localhost
.
'bill'@'localhost'
matcher 'bill'@'%'
, men ville matche (f.eks.) ''@'localhost'
på forhånd.
Den anbefalede løsning er at droppe denne anonyme bruger (det er normalt en god ting at gøre alligevel).
Redigeringerne nedenfor er for det meste irrelevante for hovedspørgsmålet. Disse er kun beregnet til at besvare nogle spørgsmål, der er rejst i andre kommentarer i denne tråd.
Rediger 1
Godkender som 'bill'@'%'
gennem en stikkontakt.
[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)
Rediger 2
Præcis samme opsætning, bortset fra at jeg genaktiverede netværk, og jeg opretter nu en anonym bruger ''@'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)
Rediger 3
Samme situation som i edit 2, nu giver den anonyme brugers adgangskode.
[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)
Konklusion 1, fra redigering 1:Man kan autentificere som 'bill'@'%'
gennem en stikkontakt.
Konklusion 2, fra redigering 2:Om man opretter forbindelse gennem TCP eller gennem en socket, har ingen indflydelse på godkendelsesprocessen (undtagen at man ikke kan oprette forbindelse som nogen anden end 'something'@'localhost'
gennem en stikkontakt, naturligvis).
Konklusion 3, fra redigering 3:Selvom jeg specificerede -ubill
, jeg har fået adgang som anonym bruger. Dette er på grund af "sorteringsreglerne" anbefalet ovenfor. Bemærk, at i de fleste standardinstallationer er et anonymt uden adgangskode bruger findes
(og bør sikres/fjernes).