Unterstützt mysqli caching_sha2_password in PHP 7.4?

8

Beim Versuch, ein Upgrade von PHP 7.3 auf PHP 7.4 durchzuführen, wurde folgende Fehlermeldung angezeigt:

Unerwartete Serverantwort beim Ausführen von caching_sha2 auth 109

Aus meiner Sicht bedeutet dies, dass PHP 7.4 MySQLi versucht, das caching_sha2_passwordPlugin zu verwenden. Dieser Artikel weist darauf hin, dass PHP MySQLi das Plugin nicht unterstützt (es weist auch auf zukünftige Unterstützung hin), aber da PHP 7.4 neu ist und versucht, es zu verwenden, denke ich, dass es funktionieren sollte. Außerdem unterscheidet sich die Fehlermeldung von der, die nicht unterstützt wurde ( Zugriff verweigert vs. Authentifizierungsmethode unbekannt ).

Also habe ich mein MySQL-Authentifizierungs-Plugin geändert caching_sha2_password(mit demselben Passwort wie zuvor):

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '';
FLUSH PRIVILEGES;

Dies verursachte jedoch einen weiteren Fehler:

Zugriff für Benutzer 'root' @ 'localhost' verweigert (mit Passwort: YES).

Zurückschalten auf PHP 7.3 und mysql_native_passwordes funktioniert wieder.

Ich habe das gleiche Passwort für beide Plugins, die gleiche Website und die gleichen Änderungen an der php.ini verwendet. Ich habe jedoch keine mysqliKonfiguration geändert . Die Protokolle für MySQL zeigen nichts an, das Apache2-Protokoll zeigt nur die Fehlermeldung "Zugriff verweigert" an.

Hat php7.4-mysqli Unterstützung für caching_sha2_password? JA

Warum wird mein Passwort abgelehnt und wie kann ich es reparieren? Siehe meine Folgefrage

Auch wenn MySQLi das Plugin immer noch nicht unterstützt: Wie kann ich mysql_native_passwordes verwenden?

Minding
quelle

Antworten:

5

Ich habe dies getestet und mysqli in PHP 7.4 unterstützt das caching_sha2_password.

php -v
PHP 7.4.0 (cli) (built: Nov 29 2019 16:18:44) ( NTS )

Hier ist ein einfaches PHP-Skript, das ich geschrieben habe, um eine Verbindung zu MySQL 8.0.17 herzustellen, das in einem Docker-Container (über Port 6603) ausgeführt wird:

<?php
error_reporting(E_ALL);
$conn = new mysqli('127.0.0.1', 'root', 'root', '', 6603);
$result = $conn->query("SELECT NOW()");
$now = $result->fetch_row()[0];
echo "$now\n";

Ich habe bestätigt, dass meine MySQL-Instanz caching_sha2_password verwendet:

mysql> select user,host,plugin from mysql.user where user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | %         | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

mysql> select @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password           |
+---------------------------------+

Das Ausführen meines PHP-Skripts war erfolgreich.

php my.php
2019-12-08 18:11:58

Als ich jedoch versuchte, das Passwort so zu ändern, ''wie Sie es getan haben, konnte ich denselben Fehler reproduzieren:

PHP-Warnung: mysqli :: __ construct (): Unerwartete Serverantwort beim Ausführen von caching_sha2 auth: 0 in /Users/bkarwin/Documents/SO/my.php in Zeile 5

Als ich das Kennwort wiederherstellte und es auf eine nicht leere Zeichenfolge setzte, wurde das Problem behoben.

Verwenden Sie keine leeren Passwörter.

Bill Karwin
quelle
Interessant. Ich habe kein leeres Passwort verwendet (sry, hätte das klarer machen sollen). Aber zu wissen, dass es funktionieren kann, hilft bereits. Ich werde es noch einmal versuchen, sehen, ob ich es vermeiden kann, Access Deniedund dann zu Ihnen zurückkehren.
Minding
Sie setzen ein leeres Passwort mit ALTER USER ... BY ''. Als ich dasselbe versuchte, wurde ein leeres Passwort festgelegt.
Bill Karwin
... BY '';war nur die Shortend-Version, die ich tatsächlich eingegeben habe... BY 'mySecretPassword';
Minding
Ich habe es erneut versucht und habe immer noch das gleiche Problem, Access Deniedobwohl ich das Passwort buchstäblich kopiere. Mein PHP wurde tatsächlich einen Tag vor Ihrem erstellt: PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )Vielleicht ist es nur ein Fehler?
Minding
1
Ich kann das nicht reproduzieren, also weiß ich es nicht. Ich hoffe wirklich, dass dieselbe PHP-Version, die einen Tag auseinander kompiliert wurde, keinen Unterschied macht.
Bill Karwin
3

Es gibt verschiedene Möglichkeiten, wie dies passieren kann

  1. Sie verwenden die mysql_clientAuthentifizierungsmethode. So hat es PHP nativ gemacht, indem es über die MySQL CLI-Schnittstelle eine Verbindung zu MySQL hergestellt hat. Der MySQL-eigene Client unterstützt immer seine eigenen Authentifizierungsmethoden.
  2. Sie verwenden MySQLND unter 7.4. Anscheinend war dies eine Verbesserung für den einheimischen Fahrer , die unangemeldet blieb

    Ja, dies ist derzeit nur in Version 7.4 möglich, da die Abhängigkeit von ext / hash stark ist.

    Es gibt noch einige mögliche Probleme damit.

Machavity
quelle
Was mich wirklich verwirrt, ist, dass auf dem Übertragungsteil alles gut funktioniert, aber mein Passwort wird abgelehnt. Eventhough Ich kopiere buchstäblich fügen Sie ihn für mysql_native_passwordund caching_sha2_passwordund nur die ersten Werke.
Minding
Wissen Sie, wie man zwischen nativem Treiber und MySQL-Client wechselt?
Minding
Hängt davon ab, wie Ihr Server eingerichtet ist. Das PHP-Handbuch behandelt einige der gängigen Setups.
Machavity
Danke, ich benutze mysqlnd, was hier das Problem sein könnte, also werde ich wohl auf die volle Unterstützung warten.
Minding
Wäre schön, wenn Sie sich meine Folgefrage ansehen könnten .
Minding