今天搭建一个测试环境时,遇到了一个很隐蔽的问题。有必要分享一下
| user | password | host |
+------+-------------------------------------------+--------------------+
| root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | localhost |1
| root | | db-2.photo.xxx.org |2
| root | | 127.0.0.1 |3
| root | | ::1 |4
| | | localhost |5
| | | db-2.photo.xxx.org |6
| sys | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | db-2.photo.xxx.org |7
...
...
如上图所示,这个里面存在着两个用户名为空的情况。然后问题就是由此而起。
在本机(服务器,db-2.photo.xxx.org) mysql -usys -ppass -h`hostname` 或者 mysql -usys -ppass -h`hostname -i` 都提示无法连接。此时配置文件里面没有 --skip-name-resolve这个参数(DNS解析用的)而用户表里面明明有这个sys@db-2.photo.xxx.org 而且密码也对了啊?起初没有注意到这个空用户,没想到它的陷阱,搞了很久也没连上,后来只好请老大了,老大过来一看,直接drop user ''@db-2.photo.xxx.org(删掉这个空用户,老大V5),然后再连,OK
搞定。
这是什么原因呢?
因为mysql在验证权限的时候,首先是验证host列,如果host列在验证user列,再password列,而现在按照我之前的连接语句:按照host列首先找到第6行,然后发现这行的user列为空(空匹配所有用户名),所以匹配到了这条记录,然后发现这条记录的密码为空,而我的连接语句里面有密码,那么就会报错。
好了,你可能会说要是我在连接的时候 -h指定的是ip地址,而不是域名(db-2.photo.xxx.org)那么不就不会匹配到了这条记录么?但是我在前面说了--skip-name-resolve这个参数我没有指定,那么就会DNS解析,将域名解析成IP地址。所以还是会被匹配到的。于是我的连接语句改为 mysql -usys -h`hostname -i` 或者 mysql -usys -h`hostname` 此时就可以连接成功,但是请注意,虽然可以连接成功,但是实际上这个连上去的用户多大权限,也就是空用户所具有的权限。
而且,我后来模拟的时候,将第6行的存放顺序(物理磁盘上)和第7行反过来(这个可以通过optimize
一下table,然后顺序插入两条用户记录解决,虽然不能说绝对的成功,因为插在磁盘上的哪个位置不是我们能控制的,但是除非你RP败坏,可能会出现后插入的记录在物理磁盘上反而在前面)(在转移博客时发现之前的理解有误,实际上与数据在物理磁盘上的顺序无关,因为将数据读到内存时会按照<hostname,username>进行排序)然后再进行前面的连接测试 mysql -usys -ppass -h`hostname -i` 或者 mysql -usys -ppass -h`hostname`, ok没问题了。同时如果将上面的连接语句去掉
-p选项,那么就是密码错误,也不会再去判断第7行了(已经调换顺序的第7行)
所以解决办法就是:
1.刚装好mysql后就直接删除那个空用户
2.连接的时候,-h+ip连接,且在配置文件里面指定 --skip-name-resolve,这样同时还能消除DNS解析带来的性能影响
另外,如果直接指定了socket的话,也不会存在这个问题,此时连接就是通过socket,而不是tcp/ip。 同时,如果你在别的机器上连接肯定也没问题,因为空用户默认的host就是主机地址。
不明白mysql5.5为什么这样设计,在mysql5.1里面就没有这个空用户。(在这次转移博客的时候发现了mysql 5.5在bin目录下提供了一个mysql_secure_installation的脚本,里面就可以删除空用户等等,看来mysql还是知道这个安全问题是存在的)
分享到:
相关推荐
mysql8 用户初始表(user),可以用于账密码忘记,用户表被篡改等情况恢复用户信息(密码是:root)
mysql中data文件的user表。即user.frm、user.MYD、user.MYI。如果你的mysql出现1067的启动错误,或者错误日志中出现Can't open and lock privilege tables: Table 'mysql.user' doesn't exist的问题。将这三个文件放...
解决Mysql Error-The user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist
mysql忘记密码,在另外一个电脑上安装xampp,在...这三个文件,并且覆盖掉出问题的xampp上安装目录下的这三个同名文件,重启mysql服务器就回复到刚装xampp时候的用户权限了! ------------------- 这里面就是那三个文件
学习Mysql的可以参考
MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限,而普通用户拥有指定的权限。 MySQL是通过权限表来控制用户对数据库访问的,权限表...
mysql5.1版本的用户手册(英文),从mysql的官方网站下载的
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决: 1.打开在创建mysql容器时挂载的conf目录下的mysqld.cnf(如下文件) 我创建docker的姿势 2.进入mysqlId.cnf文件中在...
#------------mysql root 用户无法赋权问题解决 -------- 1,登录 mysql -u root -p 2,use mysql; 选择mysql数据库 3,执行以下操作(查询用户的赋权权限,更改赋权权限 ,刷新生效) mysql> select user,host,...
Mysql用户密码设置修改和权限分配.
首先是不知道怎么忽然mysql用命令行,workbench都登录不了,都提示’Access denied for user ‘root’@’localhost’。 数据库卸载重装了几次都不行。好像感觉数据清理不干净。解决的过程遇到的坑,这里记录分享下。...
vsftp使用mysql实现虚拟用户访问
MySQL的安全系统很灵活,它允许以多种不同的方式创建用户和设置用户权限。 ;可以使用CREATE USER语法添加一个或多个用户,并设置相应的密码。 语法格式: CREATE USER 用户名 [IDENTIFIED BY [PASSWORD] '密码'] ...
MySql用户操作简单说明: 一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用...
在Linux环境下使用User用户来快速安装Mysql。并包括开放端口。
修改mysql root用户密码 修改mysql root用户密码 修改mysql root用户密码
此代码主要是用JDBC和MySQL数据库完成一个简单的用户管理系统,系统的设计模式采用工场模 式和代 理模式,此代码很适合初学Java者。 运行方法: 1.运行需要启动MySQL数据库 2.创建数据库名为zhaochao和表名为...
Mysql User表权限字段说明全介绍 一、mysql权限表user字段详解 二、创建更新mysql用户表
VB中通过MySQL C API函数库(libmysql.dll)操作Mysql的简单入门例子,不需要MyODBC。...mysql>update user set password=old_password("123") where user="abc"; 这样用户abc,密码123,可以在例程中使用了。