web-dev-qa-db-ja.com

接続エラー(2054)-mysql_old_passwordの問題はまだ解決されていません

PHP 5.4.3を使用していて、MySQLデータベース(簡潔にするためにDB)にリモートで接続したい(PHPスクリプトは、 DB)通常のオブジェクト指向プログラミング(OOP)の方法:

$mysqli = new mysqli(DB_Host, DB_USER, DB_PASS, DB_NAME);

そして私はエラーを受け取ります:

警告:mysqli :: mysqli():サーバーがクライアントに不明な認証方法を要求しました[mysql_old_password]接続エラー(2054)サーバーがクライアントに不明な認証方法を要求しました

thisthis が見つかりましたが、効果がないようです。私はPHP 5.2.9を使用し、すべて正常に動作しましたが、PHPバージョンをダウングレードすることは私にとって解決策ではありません。

また、DBの設定への完全なアクセス権がないため、クライアントからそのようなアクセス権が与えられていないことにも言及する必要があります。 Hostgatorに新しいパスワード形式のサポートを依頼するように彼に言いましたが、彼らは私が予期していないことは何もできないと答えました。私は別のリモートサーバーから新たな努力をしました、そして今私はこれを手に入れました:

接続エラー(1045)ユーザー 'user' @ 'Host'のアクセスが拒否されました(パスワードを使用:YES)

PHP 5.3.9を使用します。リモートサーバーのPHPスクリプトが原因で、DBが「私を入れてすべてが正常に動作します。

御時間ありがとうございます。

2
Marios Fakiolas

PHPは 古いMySQL認証プラグインアルゴリズム を使用することを期待している必要があります。 mysqlを再起動する必要はありません。 old_passwords はグローバルに動的なオプションであるため、次のコマンドを実行するだけで済みます。

SET GLOBAL old_passwords = 1;

さらに、これを/etc/my.cnfに追加してください:

[mysqld]
old_passwords=1

今後の再起動でこの設定が保持されるようにします。

これを行う必要性をさらに確認するには、次にmysqlにログインするときに、これを実行します。

SELECT LENGTH(password) password_length,COUNT(1) length_count
FROM mysql.user GROUP BY LENGTH(password);

長さが16のパスワードがない場合、これはPHPのログインに対する抵抗を説明している可能性があります。

悲しいことに、16文字のパスワードを設定することもできますが、41文字のパスワードをリバースエンジニアリングすることはできません。元のプレーンテキスト値を使用して、16文字のパスワードを手動で設定する必要があります。

たとえば、root @ localhostのパスワードが「helloworld」の場合、 OLD_PASSWORD 関数を使用してパスワードを変換します。ここに比較があります:

mysql> select password('helloworld');
+-------------------------------------------+
| password('helloworld')                    |
+-------------------------------------------+
| *D35DB127DB631E6E27C6B75E8D376B04F64FAF83 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select old_password('helloworld');
+----------------------------+
| old_password('helloworld') |
+----------------------------+
| 6c755a9e66debe8a           |
+----------------------------+
1 row in set (0.00 sec)

mysql>

old_passwords を有効にしたら、変換するには次のようにする必要があります。

UPDATE mysql.user
SET password = OLD_PASSWORD('helloworld')
WHERE password = PASSWORD('helloworld');
FLUSH PRIVILEGES;

2013年2月2日更新:22:44 EDT

MySQL側で認証スタイルを変更してもこの時点でうまくいかない場合は、いくつか悪いニュースがあります。あなたは以前に述べました:

私はphp 5.2.9を使用しましたが、すべてうまくいきましたが、phpを下げることは私の解決策ではありません。また、DBの設定への完全なアクセス権がないため、クライアントから完全なアクセス権が得られないことにも言及する必要があります。

PHP結局のところ、ダウングレードする必要があるかもしれません。ホスティングプロバイダーが適切な位置にないか、MySQLを調整したくない、またはダウングレードしたPHPを提供したくない場合は、 。

別の方法として、Sudo -sの実行後にすべてのソフトウェアアップグレードを完全に制御できる場合は、Amazon EC2を調べることをお勧めします。以前に言及したリンクは、あなたが知る必要があることをあなたに与えました。 MySQL側に対応するためにできることを説明しました。これを解決するためにあなたがしなければならないことがわかっていることをしてください。

4
RolandoMySQLDBA

これはかなり古い問題ですが、まだ完全には解決されていないようです。私は同じ問題に遭遇し、これを次の方法で解決しました。

MySQLのmy.iniファイルで、default_authentication_pluginからmysql_native_password

' default_authentication_plugin=caching_sha2_password  ' comment out
default_authentication_plugin=mysql_native_password

そして、MySQL Workbenchで、スキーマのパスワードタイプをsha2-somethingではなくstandardに設定しました。その後、動作します。

MySQLはバージョン8.0であり、PHPはWindow 7で実行されている7.26です。

0
SEG

複数の解決策がありますが、ほとんどの場合、アクセス権と次の機能がない場合は解決できません。

  1. PHPのダウングレード
  2. サーバー上のMYSQLのバージョンと一致するようにMYSQLライブラリをアップグレードします。
  3. My.cnfファイルを変更する

OLD_PASSWORDS = 1をコメント化

mysqlを再起動します

必要なパスワードでユーザーを作成または変更する

OLD_PASSWORDS = 1のコメントを外します

mysqlを再起動します

0
Pacop