O mysqli tem suporte para caching_sha2_password no PHP 7.4?

8

Quando tentei atualizar do PHP 7.3 para o PHP 7.4, recebi este erro:

Resposta inesperada do servidor ao executar cacheing_sha2 auth 109

A meu ver, isso indica que o MySQLi do PHP 7.4 está tentando usar o caching_sha2_passwordplugin. Este artigo indica que o PHP MySQLi não suporta o plug-in (também sugere suporte futuro para ele), mas como o PHP 7.4 é novo e parece estar tentando usá-lo, acho que deve funcionar. Além disso, a mensagem de erro é diferente do que se não fosse suportada ( acesso negado x método de autenticação desconhecido ).

Então mudei meu plugin de autenticação MySQL para caching_sha2_password(usando a mesma senha de antes):

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

Mas isso causou outro erro:

Acesso negado para o usuário 'root' @ 'localhost' (usando a senha: YES).

Voltando ao PHP 7.3 e mysql_native_passwordele funciona novamente.

Usei a mesma senha para os dois plugins, o mesmo site e apliquei as mesmas alterações do php.ini. No entanto, não alterei nenhuma mysqliconfiguração. Os logs do MySQL não mostram nada, o log do apache2 mostra apenas a mensagem de erro 'Acesso Negado'.

O php7.4-mysqli tem suporte caching_sha2_password? SIM

Por que minha senha está sendo negada e como posso corrigi-la? Veja minha pergunta de acompanhamento

Além disso, se o MySQLi ainda não suportar o plugin: Como posso usá mysql_native_password-lo?

Minding
fonte

Respostas:

5

Eu testei isso, e o mysqli no PHP 7.4 suporta o cacheing_sha2_password.

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

Aqui está um script PHP simples que escrevi para conectar ao MySQL 8.0.17 em execução em um contêiner de docker (usando a porta 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";

Confirmei que minha instância do 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           |
+---------------------------------+

A execução do meu script PHP foi bem-sucedida.

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

No entanto, quando tentei alterar a senha para ''você, consegui reproduzir o mesmo erro:

Aviso do PHP: mysqli :: __ construct (): Resposta inesperada do servidor ao fazer cacheing_sha2 auth: 0 em /Users/bkarwin/Documents/SO/my.php na linha 5

Quando restaurei a senha, definindo-a como uma seqüência de caracteres em branco, ele corrigiu o problema.

Não use senhas em branco.

Bill Karwin
fonte
Interessante. Eu não usei uma senha em branco (sry, deveria ter deixado isso mais claro). Mas saber que ele pode funcionar já ajuda. Vou tentar novamente, ver se consigo evitar Access Deniede depois voltar para você.
Minding
Você define uma senha em branco com ALTER USER ... BY ''. Quando tentei a mesma coisa, ele definiu uma senha em branco.
Bill Karwin
... BY '';era apenas a versão mais curta, na verdade eu entrei... BY 'mySecretPassword';
Minding
Tentei novamente e continuo com o mesmo problema, Access Deniedapesar de copiar literalmente a senha. Meu PHP foi construído um dia antes do seu: PHP 7.4.0 (cli) (built: Nov 28 2019 07:27:06) ( NTS )talvez seja apenas um bug?
Minding
1
Não posso reproduzir isso, então não sei. Eu realmente espero que a mesma versão do PHP compilada com um dia de diferença não faça diferença.
Bill Karwin
3

Existem algumas maneiras de isso acontecer

  1. Você está usando o mysql_clientmétodo de autenticação. É assim que o PHP costumava fazer isso de forma nativa, conectando-se ao MySQL através da interface CLI do MySQL. O próprio cliente do MySQL sempre suportará seus próprios métodos de autenticação.
  2. Você está usando o MySQLND na versão 7.4. Aparentemente, isso foi uma melhoria para o driver nativo que não foi anunciado

    Sim, isso é apenas na versão 7.4 no momento, devido à forte dependência do ext / hash.

    Ainda existem alguns problemas possíveis.

Machavity
fonte
O que realmente me confunde é que tudo funciona bem na parte de transmissão, mas minha senha é negada. Eventhough eu literalmente copiar colá-lo para o mysql_native_passworde caching_sha2_passworde somente a primeira obras.
quer
Você sabe como alternar entre driver nativo e cliente mysql?
Minding
Depende de como o servidor está configurado. O Manual do PHP aborda algumas das configurações comuns.
Machavity
Obrigado, estou usando mysqlnd, que pode ser o problema aqui, então acho que vou esperar pelo suporte total.
quer
Seria bom, se você pudesse conferir minha pergunta de acompanhamento .
quer