wake-up-neo.com

Es kann keine Verbindung zu MySQL 4.1 und älter mit der alten Authentifizierung hergestellt werden

Ich versuche, eine Verbindung zu einer MySQL-Datenbank unter http://bluesql.net herzustellen, aber wenn ich versuche, eine Verbindung herzustellen, wird dieser Fehler angezeigt:

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

Ich habe mir das genauer angesehen und es hat mit einem alten Passwortschema zu tun, das vor MySQL 4.1 verwendet wurde. Neuere Versionen haben die Möglichkeit, alte Passwörter zu verwenden, die ich gelesen habe, kann dieses Problem verursachen. 

Ich führe PHP 5.3 aus und verbinde mich mit mySQLi (new mysqli (...)). Ich hoffe, dass ich etwas im Code tun kann, um eine Verbindung zur DB auf bluesql.net herzustellen - eindeutig kann ich nicht kontrollieren, wie ihre Datenbank eingerichtet ist. Downgrade von PHP-Versionen ist keine Option.

Hat jemand Ideen?

63
B T

edit: Dies gilt nur, wenn Sie die Kontrolle über den MySQL-Server haben ... wenn Sie sich nicht die MySQL-Passwort-Hashing-Methode ansehen, alt gegen neu

Überprüfen Sie zuerst mit der SQL-Abfrage

SHOW VARIABLES LIKE 'old_passwords'

(im MySQL-Kommandozeilen-Client HeidiSQL oder ein beliebiges Frontend), ob der Server standardmäßig das alte Passwortschema verwendet. Wenn dies old_passwords,Off zurückgibt, befinden sich zufällig alte Kennworteinträge in der Tabelle user. Der MySQL-Server verwendet für diese Konten die alte Authentifizierungsroutine. Sie können einfach ein neues Passwort für das Konto festlegen und die neue Routine wird verwendet.

Sie können überprüfen, welche Routine verwendet wird, indem Sie einen Blick auf die Tabelle mysql.user werfen (mit einem Konto, das Zugriff auf diese Tabelle hat).

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

Dies gibt 16 für Konten mit alten Passwörtern und 41 für Konten mit neue Passwörter (und 0 für Konten ohne Passwort, möglicherweise möchten Sie sich auch um diese kümmern).
Verwenden Sie entweder die Benutzerverwaltungstools des MySQL-Frontends (falls vorhanden) oder

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

(Ersetzen Sie User und Host durch die Werte, die Sie aus der vorherigen Abfrage erhalten haben.) Überprüfen Sie anschließend erneut die Länge des Kennworts. Es sollte jetzt 41 sein und Ihr Client (z. B. mysqlnd) sollte in der Lage sein, eine Verbindung zum Server herzustellen.

siehe auch die MySQL-Dokumentation: * http://dev.mysql.com/doc/refman/5.0/de/old-client.html
* http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html
* http://dev.mysql.com/doc/refman/5.0/en/set-password.html

72
VolkerK

Wenn Sie nicht haben, haben Sie die Kontrolle über den Server

Ich hatte gerade dieses Problem und konnte das Problem umgehen.

Stellen Sie zunächst eine Verbindung zur MySQL-Datenbank mit einem älteren Client her, der alte Passwörter nicht berücksichtigt. Verbinden Sie sich mit dem Benutzer, den Ihr Skript verwenden wird.

Führen Sie diese Abfragen aus:

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

Ändern Sie in Ihrem PHP -Skript Ihre mysql_connect-Funktion, um das Client-Flag 1 einzuschließen:

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

Dies ermöglichte mir eine erfolgreiche Verbindung.

Edit: laut Kommentar von Garland Pope , es ist möglicherweise nicht erforderlich, CLIENT_LONG_PASSWORD manuell in Ihrem PHP - Code ab PHP 5.4 einzustellen!

Edit: mit freundlicher Genehmigung von Antonio Bonifati , einem PHP - Skript, um die Abfragen für Sie auszuführen:

<?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

sie können diese Zeile in Ihrem mysql-Abfragebrowser oder in etwas anderem ausführen

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;

hinweis: Ihr Benutzername und Passwort

danach sollte es funktionieren können. Ich habe auch gerade meine gelöst

9
Elliot Yap

Unter OSX habe ich MacPorts verwendet, um dasselbe Problem beim Herstellen einer Verbindung mit meiner Siteground-Datenbank zu beheben. Anscheinend verwendet Siteground 5.0.77mm0.1-log, das Erstellen eines neuen Benutzerkontos hat das Problem jedoch nicht behoben. Das ist was gemacht hat

Sudo port install php5-mysql -mysqlnd +mysql5

Dadurch wird der von PHP verwendete MySQL-Treiber heruntergestuft.

7
Chad Skeeters

Hatte das gleiche Problem, aber die Ausführung der Abfragen alleine wird nicht helfen. Um dies zu beheben, habe ich Folgendes getan:

  1. Legen Sie old_passwords = 0 in der Datei my.cnf fest
  2. Starten Sie Mysql neu
  3. Melden Sie sich als root-Benutzer bei mysql an
  4. FLUSH PRIVILEGES ausführen;

Wenn Sie keinen Administratorzugriff auf die MySQL Server-Konfiguration haben (d. H. Sie verwenden einen Hosting-Service), gibt es zwei Möglichkeiten, dies zu aktivieren:

1) Fordern Sie an, dass die Option old_passwords auf dem MySQL-Server auf false gesetzt ist

2) Herabstufen von PHP auf 5.2.2, bis Option 1 auftritt.

Nach dem, was ich finden konnte, scheint es das Problem zu sein, wie die Passwörter des MySQL-Kontos gespeichert werden und ob die Einstellung "old_passwords" auf "true" gesetzt ist. Dies verursacht ein Kompatibilitätsproblem zwischen MySQL und neueren Versionen von PHP (5.3+), wobei PHP versucht, eine Verbindung mit einem 41-Zeichen-Hash herzustellen, der MySQL-Server jedoch weiterhin Kontokennwörter mit einem 16-Zeichen-Hash speichert . 

Diese Inkompatibilität wurde durch die Änderung der in MySQL 4.1 verwendeten Hashmethode hervorgerufen, die sowohl kurze als auch lange Hash-Längen zulässt (Szenario 2 auf dieser Seite von der MySQL-Website: http://dev.mysql.com/doc/ refman/5.5/de/password-hashing.html ) und die Aufnahme des MySQL Native Driver in PHP 5.3 (Abwärtskompatibilitätsproblem, das in Punkt 7 dieser Seite aus der Dokumentation PHP dokumentiert ist: http://www.php.net/manual/de/migration53.incompatible.php ).

2
Robert Luman

OB,

  1. Sie verwenden ein Shared Hosting und haben keinen Root-Zugriff.
  2. sie erhalten den besagten Fehler beim Herstellen einer Verbindung zu einer entfernten Datenbank, dh: nicht localhost. 
  3. und du verwendest Xampp. 
  4. der Code läuft gut auf dem Live-Server, aber das Problem tritt nur auf Ihrem Entwicklungscomputer auf, auf dem Xampp ausgeführt wird.

Dann, 

Es ist sehr empfehlenswert dass Sie installieren xampp 1.7.0 . Download-Link

Hinweis: Dies ist keine Lösung für das obige Problem, sondern ein FIX, mit dem Sie mit Ihrer Entwicklung fortfahren können. 

0
MortalViews