Prawdopodobnie masz anonimowego użytkownika ''@'localhost'
lub ''@'127.0.0.1'
.
Zgodnie z instrukcją :
Gdy możliwe jest wiele dopasowań, serwer musi określić, którego z nich użyć. Rozwiązuje ten problem w następujący sposób:(...)
- Kiedy klient próbuje się połączyć, serwer przegląda wiersze [tabeli mysql.user] w posortowanej kolejności.
- Serwer używa pierwszego wiersza, który odpowiada nazwie hosta klienta i nazwie użytkownika.
(...)Serwer używa reguł sortowania, które porządkują wiersze z najbardziej szczegółowymi wartościami hosta na początku .Dosłowne nazwy hostów [takie jak „localhost”] a adresy IP są najbardziej szczegółowe.
Dlatego taki anonimowy użytkownik „zamaskowałby” każdego innego użytkownika, takiego jak '[any_username]'@'%'
podczas łączenia z localhost
.
'bill'@'localhost'
pasuje do 'bill'@'%'
, ale pasowałby (np.) ''@'localhost'
wcześniej.
Zalecanym rozwiązaniem jest usunięcie tego anonimowego użytkownika (i tak zwykle jest to dobre rozwiązanie).
Poniższe zmiany są w większości nieistotne dla głównego pytania. Mają one na celu tylko udzielenie odpowiedzi na niektóre pytania zadane w innych komentarzach w tym wątku.
Edytuj 1
Uwierzytelnianie jako 'bill'@'%'
przez gniazdo.
[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)
Edytuj 2
Dokładnie taka sama konfiguracja, z wyjątkiem tego, że ponownie aktywowałem sieć i teraz tworzę anonimowego użytkownika ''@'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)
Edytuj 3
Taka sama sytuacja jak w edycji 2, teraz z podaniem hasła anonimowego użytkownika.
[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)
Wniosek 1, z edycji 1:Można uwierzytelnić się jako 'bill'@'%'
przez gniazdo.
Wniosek 2, z edycji 2:To, czy ktoś łączy się przez TCP, czy przez gniazdo, nie ma wpływu na proces uwierzytelniania (poza tym, że nie można połączyć się jako ktokolwiek inny niż 'something'@'localhost'
oczywiście przez gniazdo).
Wniosek 3, z edycji 3:Chociaż podałem -ubill
, przyznano mi dostęp jako anonimowy użytkownik. Wynika to z zalecanych powyżej „reguł sortowania”. Zauważ, że w większości domyślnych instalacji bez hasła, anonimowe użytkownik istnieje
(i powinny być zabezpieczone/usunięte).