プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHPで「mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.」エラーが発生した
結論から書くと、互換性の問題です。
PHP5.3以降から、MySQLの古い形式(ハッシュ値の長さが16バイト)のパスワードを
サポートしなくなったのが原因です。
MySQL側のパスワードを新しい形式(ハッシュ値の長さが41バイト)にするしかないっぽいですね。
なお、パスワードを新形式にする方法は、例えば以下の通りです。

1.「my.cnf」にある「old_passwords=1」の記述を削除。もしくは「old_passwords=0」に変更
2.MySQL(mysqld)を再起動
3.パスワードを再設定(パスワードとして設定する文字列は前と同じでOK)


それでは、詳細を書いていきます。

お客さまから「PHPのバージョンを上げたらエラーになった」とご連絡をいただきました。
調べてみると、DB接続でエラーになっているようです。
エラーの内容は以下の通りでした。

Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in /hoge/test.php on line 35


該当箇所のコードはこんな感じφ(--)

if(!($cn = @mysql_connect("server", "id", "password"))) {
    throw new Exception("データベースとの接続に失敗しました。". __LINE__);
}

(´・д・`)ェー

DBに接続してるだけじゃん。
PHPのバージョン上げたからって、こんなのに影響あるかよ?!と思ったら、ありました(^^ゞ

MySQLでは、パスワードをハッシュ値に変換して保存しています。
そのハッシュ値の長さは、2014年9月現在の最新バージョンでは41バイトです。
でも古いバージョンのMySQLでは16バイトでした。

MySQLでは、互換性を保持する為に古い形式のパスワードをサポートしています。
MySQLの設定ファイル「my.cnf」に

old_password = 1

の記述があると、パスワードのハッシュ値を16バイトで生成してくれるのだそうです。

ところがですね。

PHP側はこいつに対する対応を止めました。
PHP5.3以降では「ハッシュ値が16バイトのパスワードなんて知らねーよ」なのです。

そのため、PHP5.3以降で、旧形式のパスワードが設定されたMySQLのユーザ情報を使って
「mysql_connect()」を実行すると、上記のエラーになります。
なんてこったい。

対処法はハッシュ値が41バイトのパスワードを設定したユーザ情報を使うことですね。

MySQLの設定ファイル「my.cnf」に

old_password = 1

の記述があるとパスワードのハッシュ値が16バイトで生成されるので、
この記述を消すか「1」を「0」に変更します。

次にmysqldを再起動して、変更内容を反映させます。

残念ながら、今までに設定したパスワードのハッシュ値が
自動的に16バイトから41バイトに変更されるなんてことはありません。
パスワードを再設定します。

再設定するパスワードは同じもので大丈夫です。
単にハッシュ値の長さを16バイトから41バイトにしたいだけなので。
再設定することで16バイトのハッシュ値だったのが41バイトのハッシュ値に変わります。

これで私の環境では状況が改善しました。
いつの世も互換性の問題は面倒くさいですね(--ゞ

取りあえず、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事