sql >> Database >  >> RDS >> Mysql

MySQL ERROR 1045 (28000):Toegang geweigerd voor gebruiker 'bill'@'localhost' (met wachtwoord:JA)

Je hebt waarschijnlijk een anonieme gebruiker ''@'localhost' of ''@'127.0.0.1' .

Volgens de handleiding :

Als er meerdere overeenkomsten mogelijk zijn, moet de server bepalen welke ervan moet worden gebruikt. Het lost dit probleem als volgt op:(...)

  • Als een client verbinding probeert te maken, kijkt de server door de rijen [van tabel mysql.user] in gesorteerde volgorde.
  • De server gebruikt de eerste rij die overeenkomt met de hostnaam en gebruikersnaam van de client.

(...)De server gebruikt sorteerregels die rijen rangschikken met de meest specifieke Host-waarden eerst .Letterlijke hostnamen [zoals 'localhost'] en IP-adressen zijn het meest specifiek.

Daarom zou zo'n anonieme gebruiker elke andere gebruiker "maskeren" zoals '[any_username]'@'%' bij verbinding vanaf localhost .

'bill'@'localhost' komt overeen met 'bill'@'%' , maar zou overeenkomen met (bijv.) ''@'localhost' vooraf.

De aanbevolen oplossing is om deze anonieme gebruiker te verwijderen (dit is hoe dan ook meestal een goede zaak).

Bewerkingen hieronder zijn meestal niet relevant voor de hoofdvraag. Deze zijn alleen bedoeld om een ​​aantal vragen te beantwoorden die in andere opmerkingen in deze thread zijn gesteld.

Bewerk 1

Authenticeren als 'bill'@'%' via een stopcontact.

    [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)

Bewerk 2

Exact dezelfde setup, behalve dat ik het netwerk opnieuw heb geactiveerd en ik nu een anonieme gebruiker maak ''@'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)

Bewerk 3

Dezelfde situatie als in bewerking 2, nu het wachtwoord van de anonieme gebruiker.

    [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)

Conclusie 1, uit bewerking 1:Men kan authenticeren als 'bill'@'%' via een stopcontact.

Conclusie 2, van edit 2:Of men verbinding maakt via TCP of via een socket heeft geen invloed op het authenticatieproces (behalve dat men geen verbinding kan maken zoals iemand anders dan 'something'@'localhost' natuurlijk via een stopcontact).

Conclusie 3, uit bewerking 3:Hoewel ik -ubill heb gespecificeerd , heb ik toegang gekregen als anonieme gebruiker. Dit vanwege de hierboven geadviseerde "sorteerregels". Merk op dat in de meeste standaardinstallaties, een wachtwoord zonder wachtwoord, anoniem gebruiker bestaat (en moet worden beveiligd/verwijderd).



  1. Oracle Regexp om \n,\r en \t te vervangen door spatie

  2. Selecteer de eerste rij van elke groep in sql

  3. MySQL laadt NULL-waarden uit CSV-gegevens

  4. MySQL:Hoe kan ik meerdere keren deelnemen aan dezelfde tafel?