挠头的php连接mysql数据库的报错,终于解决了,赶紧分享出来,大家少踩坑吧

       最近马上要对一些互联网企业的技术人员举行培训,想着今天要把我们自己的攻防演练的靶场搭建起来,提前备课,kakaxi有一个习惯,再熟悉的课程也会在培训之前进行备课(感觉在夸自己认真负责了,自己都不好意思了),但是始终报一个错误:
连接mysql数据时提示错误: “ERROR 1698 (28000): Access denied for user ‘root’@’localhost'”,网上众说纷纭,很多方法都不灵,有很多只告诉了方法,而且还不好使,都是一知半解,没有分析问题的原因的,所以,经过自虐了好长一段时间,终于算是找到根上了。 
环境介绍: 


操作系统:Linux kali 4.15.0-kali2-amd64 #1 SMP Debian 4.15.11-1kali1 (2018-03-21) x86_64 GNU/Linux
PHP版本:PHP 7.2.4-1 (cli) (built: Apr  5 2018 08:50:27) ( NTS )  
数据库:mysql  Ver 15.1 Distrib 10.1.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2


 
问题现象就是:


web页面报错 :「Could not connect:」
web服务器日志  /var/log/apache2/error.log 中显示如下错误:

[Tue Jun 05 06:12:55.420068 2018] [php7:warn] [pid 9648] [client 172.16.155.1:56318] PHP Warning:  mysqli_connect(): (HY000/1698): Access denied for user 'root'@'localhost' in /var/www/html/sys/config.php on line 7
在系统上,使用root帐号登录mysql是没有问题的:
root@kali:/var/www/html# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 66
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
如果输入 mysql -h 127.0.0.1 -uroot -p,就加入了一个-h的参数指定服务器的地址,就会禁止登录(有同学会问,为啥要这样做,其实就是为了模拟web服务器连接数据库的过程,所以你应该懂得)
root@kali:/var/www/html# mysql -h 127.0.0.1 -uroot -p
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
用户名是root,密码为空


原因分析:


为了找到这个问题:查看了数据库用户的信息,确定了两个关键的字段;



MariaDB [(none)]> select user,plugin from mysql.user;
+------+-------------+
| user | plugin |
+------+-------------+
| root | unix_socket |
| wt | |
+------+-------------+
2 rows in set (0.00 sec)

这个里面非常关键的信息就是在数据库用户的表里有一个列属性是plugin,mysql从5.5.7开始引入plugins 以进行用户连接时的密码验证,plugin创建外部/代理用户。mysql官网上原文如下:



Plugins for authenticating attempts by clients to connect to MySQL Server. Plugins are available for several authentication protocols.


进一步查看相关内容得到:
Plugin主要提供了三中方法:unix_socket、mysql_native_password、 mysql_old_password(在 MySQL 5.7.5版本已经被废除掉了)
 
其中mysql_native_password是指使用mysql数据库中的user表里的用户密码进行验证,unix_socket 是 socket 链接。  所以需要将root用户的plugin 值由unix_socket 改为mysql_native_password,然后就flush privileges ,重启mysql服务,果然ok了。
具体过程如下:
root@kali:/var/www/html# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.1.29-MariaDB-6 Debian buildd-unstable

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> update user set plugin='mysql_native_password' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

MariaDB [mysql]> select user,plugin from user;
+------+-----------------------+
| user | plugin |
+------+-----------------------+
| root | mysql_native_password |
| wt | |
+------+-----------------------+
2 rows in set (0.00 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit
Bye
root@kali:/var/www/html# service mysql restart
root@kali:/var/www/html#
再次打开网页,Happy,Happy,我又看到了熟悉的界面
 

WX20180605-185526@2x.png

 
 


 


0 个评论

要回复文章请先登录注册