Pravděpodobně máte anonymního uživatele ''@'localhost'
nebo ''@'127.0.0.1'
.
Podle příručky :
Je-li možné více shod, musí server určit, kterou z nich použít. Tento problém řeší následovně:(...)
- Když se klient pokusí připojit, server prohlédne řádky [tabulky mysql.user] v seřazeném pořadí.
- Server používá první řádek, který odpovídá názvu hostitele klienta a uživatelskému jménu.
(...)Server používá pravidla řazení, která řadí řádky nejprve podle nejkonkrétnějších hodnot hostitele .Doslovné názvy hostitelů [jako 'localhost'] a IP adresy jsou nejkonkrétnější.
Takový anonymní uživatel by tedy „zamaskoval“ jakéhokoli jiného uživatele, jako je '[any_username]'@'%'
při připojování z localhost
.
'bill'@'localhost'
odpovídá 'bill'@'%'
, ale odpovídal by (např.) ''@'localhost'
předem.
Doporučeným řešením je zahodit tohoto anonymního uživatele (to je obvykle dobré udělat tak jako tak).
Níže uvedené úpravy se většinou netýkají hlavní otázky. Tyto jsou určeny pouze k zodpovězení některých otázek vznesených v jiných komentářích v tomto vláknu.
Úprava 1
Ověřování jako 'bill'@'%'
prostřednictvím zásuvky.
[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)
Úprava 2
Úplně stejné nastavení, až na to, že jsem znovu aktivoval síť a nyní vytvářím anonymního uživatele ''@'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)
Úprava 3
Stejná situace jako v úpravě 2, nyní poskytujeme heslo anonymního uživatele.
[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)
Závěr 1 z úpravy 1:Lze se ověřit jako 'bill'@'%'
prostřednictvím zásuvky.
Závěr 2 z úpravy 2:To, zda se člověk připojuje přes TCP nebo přes soket, nemá žádný vliv na proces ověřování (kromě toho, že se nelze připojit jako kdokoli jiný než 'something'@'localhost'
přes zásuvku, samozřejmě).
Závěr 3 z úpravy 3:Ačkoli jsem zadal -ubill
, byl mi udělen přístup jako anonymní uživatel. Důvodem jsou výše uvedená „pravidla řazení“. Všimněte si, že ve většině výchozích instalací bez hesla, anonymní uživatel existuje
(a měl by být zajištěn/odebrán).