今回は、MySQL データベースのアクセス拒否に対処する方法と、MySQL データベースのアクセス拒否に対処する際の注意点について説明します。以下は実際のケースですので、見てみましょう。
ブログの構築にはwordpressを使用し、データベースにはMySQLを使用します。デバッグの便宜のために、アカウント my_account を作成し、任意のホストからデータベースにアクセスできるようにします。
CREATE USER `my_account`@'%' IDENTIFIED BY 'my_password';Copy
wp-config.php の対応する設定を変更します。DB_HOST が 127.0.0.1 に設定されていることに注意してください。
define('DB_USER', 'my_account'); // 账号 define('DB_PASSWORD', 'my_password'); // 密码 define('DB_HOST', '127.0.0.1'); // 数据服务地址Copy
クラウドサーバーにデプロイされ、ローカルブラウザがブログにアクセスし、データベースアクセスが拒否されたことを示すプロンプトが表示されます(リモートデータへのローカル接続は問題ありません)。以下はエラーログです。
エラー 1045 (28000): ユーザー 'my_account'@'localhost' のアクセスが拒否されました (パスワードを使用: YES)`Copy
簡単なトラブルシューティングの後、問題は解決されました。解決策とエラーの原因がここに記録されます。 。
解決策
1. 解決策 1: mysql.user テーブルの Host フィールドが localhost である匿名アカウントを削除します (アカウント名は空です)。
2. 解決策 2: データベースへのローカル接続用の my_account@localhost アカウントを作成します。
著者は計画 1 を採用しました。
まず、mysql.userテーブルに匿名アカウントがあるかどうかを確認します。
MariaDB [(none)]> SELECT User, Host from mysql.user WHERE Host = 'localhost' AND User = ''; +------+-----------+ | User | Host | +------+-----------+ | | localhost | +------+-----------+ 1 row in set (0.00 sec)Copy
その後、該当する匿名アカウントを削除し、再度ログインしてみると成功します。
MariaDB [(none)]> DROP USER ''@'localhost'; Query OK, 0 rows affected (0.00 sec)Copy
問題分析
匿名アカウントがデータベース接続エラーを引き起こすのはなぜですか?
MySQL アカウントの作成とクライアント接続の検証について一定の理解が必要です。
MySQL アカウントを作成します
基本的な構文は次のとおりです:
CREATE USER Account name@Host IDENTIFIED BY Password;Copy
注: (ユーザーは以下のアカウント名を参照するために使用され、ホストはホストを参照します) )
ホストは、データベースにアクセスするホストから許可されたアカウントを示します。主にセキュリティ制限に使用され、ホスト名、IP アドレス、% (ワイルドカード) を使用できます。ホストが異なる限り、ユーザーを繰り返すことができます。
ホストが % に設定されている場合、データベースはどのホストからでも接続できることを意味します。
たとえば、xiaoming アカウントが 2 つあり、1 つはローカル マシンからデータベースへの接続を許可し、もう 1 つは 14.215.177.39 からデータベースへの接続を許可します。
MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE User = 'xiaoming'; +---------+---------------+ | User | Host | +---------+---------------+ | xiaoming | 14.215.177.39 | | xiaoming | localhost | +---------+---------------+ 2 rows in set (0.00 sec)Copy
匿名アカウント
は、ユーザーが空で、任意のユーザー名に一致するアカウントです。次のコマンドは匿名アカウントを作成します。
CREATE USER ''@'localhost' IDENTIFIED BY 'pwd3';Copy
ID検証
データベースサーバーがクライアント接続を受信すると、まずID検証を実行し、ユーザー、ホスト、およびパスワードフィールドを追加します。 mysql .user テーブル内のレコードを比較して、アカウントが正当かどうかを確認します。
ここで質問があります: mysql.user テーブルに一致するレコードが複数ある場合、どのレコードが優先されるべきですか?
答えは「優先順位」です。一般的なルールは次のとおりです:
まず、[ホスト] フィールドを確認します。複数のホストが基準を満たす場合、一致スコアが最も高いレコード (IP アドレス > ワイルドカード %) が選択されます。
次に、「ユーザー」フィールドを確認します。複数のユーザーが条件を満たした場合、最も一致度が高いレコードが選択されます。匿名ユーザーは任意のユーザーと一致するため、一致度は最も低くなります。
優先順位の一致の例
たとえば、ローカル データベースに次の 2 つのアカウントがあるとします (パスワード フィールドは実際にはクリア テキストではありません)。
+------------+-----------+-----------+ | User | Host | Password | +------------+-----------+-----------+ | my_account | % | 123 | | | localhost | 456 | +------------+-----------+-----------+Copy
最終的にログインしたアカウントは 2 番目のレコードと一致します。 (読者はご自身で試してみてください。パスワードが 123 の場合はログインに失敗しますが、パスワードが 456 の場合はログインに成功します。)
mysql -u my_account -pCopy
なぜですか?一致する優先順位を確認します。
まず、[ホスト]フィールドを確認します。 localhost と % はすべて要件を満たしています。 localhost の一致度が % より高いため、2 番目のレコードが一致します。
次に、「ユーザー」フィールドを確認します。 2 番目のレコードは匿名アカウントであり、任意の User 値と一致するため、2 番目のレコードは要件を満たしています。
したがって、アカウント my_account の Host フィールドは % ですが、データベースにローカル (データベースが配置されているホスト) に接続すると、上記のルールが存在するため、MySQL はユーザーが匿名アカウント。
my_account のパスワードが匿名アカウントとは異なるため、パスワードの検証が失敗し、アクセスが拒否されます。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
react で選択した li を強調表示する手順の詳細な説明
node.js デプロイメントのスタートアップ バックグラウンドで永久に実行されるステップバイステップの説明
以上がMySQLデータベースへのアクセスが拒否された場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。