web-dev-qa-db-fra.com

Impossible de se connecter à MySQL 4.1+ avec une ancienne authentification

J'essaie de me connecter à une base de données MySQL à l'adresse http://bluesql.net , mais lorsque j'essaie de me connecter, le message d'erreur suivant s'affiche:

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication

J'ai examiné cette question, et cela a à voir avec un ancien schéma de mot de passe utilisé avant MySQL 4.1. Les versions plus récentes ont la possibilité d'utiliser d'anciens mots de passe, ce que j'ai lu peut être à l'origine de ce problème. 

J'utilise PHP 5.3 et je me connecte avec mySQLi (new mysqli (...)). J'espère que je peux faire quelque chose dans le code pour me connecter à la base de données sur bluesql.net - de toute évidence, je ne contrôle pas la configuration de leur base de données. Rétrograder les versions php n'est pas une option.

Quelqu'un a des idées?

63
B T

edit: Ceci ne s'applique que si vous êtes en contrôle du serveur MySQL ... si vous ne regardez pas/ La méthode de hachage du mot de passe Mysql old vs new

Première vérification avec la requête SQL

SHOW VARIABLES LIKE 'old_passwords'

(dans le client en ligne de commande MySQL, HeidiSQL ou le frontal que vous préférez), que le serveur soit configuré pour utiliser l’ancien schéma de mot de passe par défaut. Si cela retourne old_passwords,Off, vous avez simplement des anciens mots de passe dans la table user. Le serveur MySQL utilisera l'ancienne routine d'authentification pour ces comptes. Vous pouvez simplement définir un nouveau mot de passe pour le compte et la nouvelle routine sera utilisée. 

Vous pouvez vérifier quelle routine sera utilisée en consultant la table mysql.user (avec un compte ayant accès à cette table)

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user

Ceci renverra 16 pour les comptes avec un ancien mot de passe et 41 pour les comptes avec un nouveau mot de passe (et 0 pour les comptes sans mot de passe, vous voudrez peut-être aussi en prendre soin).
Utilisez les outils de gestion des utilisateurs du front-end MySQL (s’il en existe) ou

SET PASSWORD FOR 'User'@'Host'=PASSWORD('yourpassword');
FLUSH Privileges;

(remplacez User et Host par les valeurs que vous avez obtenues à partir de la requête précédente.) Ensuite, vérifiez à nouveau la longueur du mot de passe. Ce devrait être 41 maintenant et votre client (par exemple, mysqlnd) devrait pouvoir se connecter au serveur.

voir aussi la documentation MySQL: * http://dev.mysql.com/doc/refman/5.0/fr/old-client.html
* http://dev.mysql.com/doc/refman/5.0/fr/password-hashing.html
* http://dev.mysql.com/doc/refman/5.0/fr/set-password.html

69
VolkerK

Si vous avez pas le contrôle du serveur

Je viens d'avoir ce problème et j'ai été capable de le contourner.

Commencez par vous connecter à la base de données MySQL avec un client plus ancien qui ne craint pas old_passwords. Connectez-vous en utilisant l'utilisateur que votre script utilisera.

Exécutez ces requêtes:

SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD('[your password]');

Dans votre script PHP, changez votre fonction mysql_connect pour inclure l'indicateur client 1:

define('CLIENT_LONG_PASSWORD', 1);
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD);

Cela m'a permis de me connecter avec succès.

Edit: Selon le commentaire de Garland Pope , il n'est peut-être plus nécessaire de définir manuellement CLIENT_LONG_PASSWORD dans votre code PHP à partir de PHP 5.4!

Edit: avec l'aimable autorisation de Antonio Bonifati , un script PHP permettant d'exécuter les requêtes pour vous:

<?php const DB = [ 'Host' => '...', # localhost may not work on some hosting 
    'user' => '...',
    'pwd' => '...', ]; 

if (!mysql_connect(DB['Host'], DB['user'], DB['pwd'])) {
    die(mysql_error());
} if (!mysql_query($query = 'SET SESSION old_passwords=FALSE')) {
    die($query);
} if (!mysql_query($query = "SET PASSWORD = PASSWORD('" . DB['pwd'] . "')")) {
    die($query);
}

echo "Excellent, mysqli will now work"; 
?>
62
TehShrike

vous pouvez faire ces lignes sur votre navigateur de requête mysql ou quelque chose

SET old_passwords = 0;
UPDATE mysql.user SET Password = PASSWORD('testpass') WHERE User = 'testuser' limit 1;
SELECT LENGTH(Password) FROM mysql.user WHERE User = 'testuser';
FLUSH PRIVILEGES;

note: votre nom d'utilisateur et mot de passe

après cela, il devrait pouvoir travailler. Je viens de résoudre le mien aussi

9
Elliot Yap

Sous OSX, j’utilisais MacPorts pour résoudre le même problème lors de la connexion à la base de données de mon siteground. Siteground semble utiliser 5.0.77mm0.1-log, mais la création d'un nouveau compte d'utilisateur n'a pas résolu le problème. C'est ce que fait

Sudo port install php5-mysql -mysqlnd +mysql5

Cela dégrade le pilote mysql que php utilisera.

7
Chad Skeeters

Avait le même problème, mais exécuter les requêtes seul ne va pas aider. Pour résoudre ce problème, j'ai fait ce qui suit,

  1. Définissez old_passwords = 0 dans le fichier my.cnf
  2. Redémarrer mysql
  3. Se connecter à mysql en tant qu'utilisateur root
  4. Exécuter FLUSH PRIVILEGES;
2

Si vous ne disposez pas d'un accès administrateur à la configuration du serveur MySQL (c'est-à-dire que vous utilisez un service d'hébergement), il existe 2 options pour que cela fonctionne:

1) Demander que l'option old_passwords soit définie sur false sur le serveur MySQL

2) rétrogradez PHP en 5.2.2 jusqu'à ce que l'option 1 apparaisse.

D'après ce que j'ai pu trouver, le problème semble être lié au mode de stockage des mots de passe du compte MySQL et à la valeur true du paramètre 'old_passwords'. Cela pose un problème de compatibilité entre MySQL et les versions plus récentes de PHP (5.3+) où PHP tente de se connecter avec un hachage de 41 caractères alors que le serveur MySQL stocke toujours les mots de passe de compte avec un hachage de 16 caractères . 

Cette incompatibilité a été provoquée par le changement de méthode de hachage utilisé dans MySQL 4.1, qui permet des longueurs de hachage courtes et longues (scénario 2 sur cette page du site MySQL: http://dev.mysql.com/doc/ refman/5.5/fr/password-hashing.html ) et l’inclusion du pilote natif MySQL dans PHP 5.3 (problème de compatibilité avec les versions antérieures décrit à la puce 7 de cette page à partir de la documentation PHP: http://www.php.net/manual/fr/migration53.incompatible.php ).

2
Robert Luman

SI,

  1. Vous utilisez un hébergement partagé et n'avez pas d'accès root.
  2. vous obtenez l'erreur en vous connectant à une base de données distante, c'est-à-dire: pas localhost. 
  3. et votre utilisation de Xampp. 
  4. et le code fonctionne correctement sur le serveur actif, mais le problème ne concerne que votre ordinateur de développement exécutant xampp.

Ensuite, 

Il est hautement recommandé que vous installez xampp 1.7.0 . Lien de téléchargement

Remarque: Ce n'est pas une solution au problème ci-dessus, mais un FIX qui vous permettrait de continuer votre développement. 

0
MortalViews