¿Mysqli tiene soporte para caching_sha2_password en PHP 7.4?

8

Cuando intenté actualizar de PHP 7.3 a PHP 7.4, recibí este error:

Respuesta inesperada del servidor al hacer caching_sha2 auth 109

A mi entender, esto indica que PHP 7.4 MySQLi está intentando utilizar el caching_sha2_passwordcomplemento. Este artículo señala que PHP MySQLi no es compatible con el complemento (también sugiere soporte futuro para él), pero dado que PHP 7.4 es nuevo y parece estar tratando de usarlo, supongo que debería funcionar. Además, el mensaje de error es diferente que si no fuera compatible ( acceso denegado versus método de autenticación desconocido ).

Así que cambié mi complemento de autenticación MySQL a caching_sha2_password(usando la misma contraseña que antes):

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

Pero esto causó otro error:

Acceso denegado para el usuario 'root' @ 'localhost' (usando la contraseña: YES).

Volviendo a PHP 7.3 y mysql_native_passwordfunciona de nuevo.

Utilicé la misma contraseña para ambos complementos, el mismo sitio web y apliqué los mismos cambios en php.ini. Sin embargo, no cambié ninguna mysqliconfiguración. Los registros de MySQL no muestran nada, el registro de apache2 solo muestra el mensaje de error 'Acceso denegado'.

¿Php7.4-mysqli tiene soporte para caching_sha2_password? SI

¿Por qué se niega mi contraseña y cómo puedo solucionarla? Ver mi pregunta de seguimiento

Además, si MySQLi aún no es compatible con el complemento: ¿Cómo puedo usarlo mysql_native_password?

Minding
fuente

Respuestas:

5

Probé esto, y mysqli en PHP 7.4 es compatible con caching_sha2_password.

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

Aquí hay un script PHP simple que escribí para conectarme a MySQL 8.0.17 que se ejecuta en un contenedor acoplable (usando el puerto 6603):

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

Confirmé que mi instancia de MySQL está usando caching_sha2_password:

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

Ejecutando mi script PHP, fue exitoso.

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

Sin embargo, cuando intenté cambiar la contraseña ''como lo hiciste, pude reproducir el mismo error:

Advertencia de PHP: mysqli :: __ construct (): Respuesta inesperada del servidor al realizar la autenticación caching_sha2: 0 en /Users/bkarwin/Documents/SO/my.php en la línea 5

Cuando restauré la contraseña, configurándola en una cadena no en blanco, solucionó el problema.

No uses contraseñas en blanco.

Bill Karwin
fuente
Interesante. No utilicé una contraseña en blanco (sry, debería haberlo aclarado). Pero saber que puede funcionar ya ayuda. Lo intentaré de nuevo, veré si puedo evitarlo Access Deniedy luego volveré a ti.
Minding
Configura una contraseña en blanco con ALTER USER ... BY ''. Cuando intenté lo mismo, estableció una contraseña en blanco.
Bill Karwin
... BY '';era solo la versión abreviada, en realidad entré... BY 'mySecretPassword';
Minding
Lo intenté de nuevo, y todavía tengo el mismo problema Access Deniedaunque literalmente copie la contraseña. Mi PHP fue construido un día antes que el tuyo: ¿ PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )tal vez es solo un error?
Minding
1
No puedo reproducir eso, así que no lo sé. Realmente espero que la misma versión PHP compilada con un día de diferencia no haga la diferencia
Bill Karwin
3

Hay un par de formas en que esto podría suceder

  1. Estás utilizando el mysql_clientmétodo de autenticación. Así es como PHP solía hacerlo de forma nativa, conectándose a MySQL a través de la interfaz CLI de MySQL. El propio cliente de MySQL siempre admitirá sus propios métodos de autenticación.
  2. Estás utilizando MySQLND bajo 7.4. Aparentemente, esto fue una mejora para el controlador nativo que no fue anunciado

    Sí, esto es solo en 7.4 en este momento, debido a la fuerte dependencia de ext / hash.

    Todavía hay algunos posibles problemas con él.

Machavity
fuente
Lo que realmente me confunde es que todo funciona bien en la parte de transmisión, pero mi contraseña es denegada. Apesar de que, literalmente, copiar y pegar para mysql_native_passwordy caching_sha2_passwordya sólo uno de los primeros trabajos.
Minding
¿Sabes cómo cambiar entre el controlador nativo y el cliente mysql?
Minding
Depende de cómo esté configurado su servidor. El Manual PHP repasa algunas de las configuraciones comunes.
Machavity
Gracias, estoy usando mysqlnd, lo que podría ser el problema aquí, así que supongo que esperaré para obtener soporte completo.
Minding el
Sería bueno, si pudieras revisar mi pregunta de seguimiento .
Minding