- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈Mysql连接数据库时host和user的匹配规则由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
--连接数据库时,host和user的匹配规则 。
官方文档:https://dev.mysql.com/doc/refman/5.7/en/connection-access.html 。
。
--是host为明确的最先匹配,host带%模糊的时候最后匹配,但host为''(空)位于%之后才匹配 。
--相同的host时候,比较user为明确的最先匹配,user为''(空)最后匹配 。
--相同的host和user时,排序是不确定的 。
1
2
3
4
5
|
When
multiple matches are possible, the server must determine which
of
them
to
use. It resolves this issue
as
follows:
Whenever the server reads the
user
table
into
memory, it sorts the
rows
.
When
a client attempts
to
connect
, the server looks through the
rows
in
sorted
order
.
The server uses the
first
row that matches the client host
name
and
user
name
.
The server uses sorting rules that
order
rows
with
the most-specific Host
values
first
. Literal host names
and
IP addresses are the most specific. (The specificity
of
a literal IP address
is
not
affected
by
whether it has a netmask, so 198.51.100.13
and
198.51.100.0/255.255.255.0 are considered equally specific.) The pattern
'%'
means “
any
host”
and
is
least specific. The empty string
''
also means “
any
host” but sorts
after
'%'
.
Rows
with
the same Host value are ordered
with
the most-specific
User
values
first
(a blank
User
value means “
any
user
”
and
is
least specific).
For
rows
with
equally-specific Host
and
User
values
, the
order
is
nondeterministic.
|
--查看当前的host及用户信息匹配顺序,先host顺序匹配、后user顺序匹配 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql>
SELECT
authentication_string, host,
user
,account_locked
FROM
mysql.
USER
ORDER
BY
host
desc
,
user
desc
;
+
-------------------------------------------+--------------+---------------+----------------+
| authentication_string | host |
user
| account_locked |
+
-------------------------------------------+--------------+---------------+----------------+
| *511C0A408C5065XXEC90D60YYA1AB9437281AF28 | localhost | root | N |
| *THISISNOTAVALIXXASSWORDYYATCANBEUSEDHERE | localhost | mysql.sys | Y |
| *THISISNOTAVALIXXASSWORDYYATCANBEUSEDHERE | localhost | mysql.session | Y |
| *485CE31BA547A4XXC047659YY10DF200F361CD4E | localhost | bkpuser | N |
| *7B502777D8FF69XX4B56BC2YY2867F4B47321BA8 | 192.168.56.% | repl | N |
| *AECCE73463829AXX3968838YYF6F85E43C3F169C | % | flyremote | N |
| *566AC8467DAAAEXXE247AE7YY0A770E9B97D9FB0 | | flylocal | N |
+
-------------------------------------------+--------------+---------------+----------------+
8
rows
in
set
(0.00 sec)
|
--举个特殊例子 。
--建立两个特殊用户如下,一个用户名为''(空)、一个用户名和host都为''(空) 。
1
2
3
4
|
mysql>
create
user
''
@
'localhost'
identified
by
"Kong123$"
;
Query OK, 0
rows
affected (0.00 sec)
mysql>
create
user
''
@
''
identified
by
"doubleKong123$"
;
Query OK, 0
rows
affected (0.00 sec)
|
--查看当前的host及用户信息匹配顺序,先host顺序匹配、后user顺序匹配 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
mysql>
SELECT
authentication_string, host,
user
,account_locked
FROM
mysql.
USER
ORDER
BY
host
desc
,
user
desc
;
+
-------------------------------------------+--------------+---------------+----------------+
| authentication_string | host |
user
| account_locked |
+
-------------------------------------------+--------------+---------------+----------------+
| *511C0VVV8C5065CBEC90D6TTTT1AB9437281AF28 | localhost | root | N |
| *THISIVVVTAVALIDPASSWORTTTTTCANBEUSEDHERE | localhost | mysql.sys | Y |
| *THISIVVVTAVALIDPASSWORTTTTTCANBEUSEDHERE | localhost | mysql.session | Y |
| *485CEVVVA547A48CC04765TTTT0DF200F361CD4E | localhost | bkpuser | N |
| *256D7VVV91F7363EBDADEFTTTTB74B2B318746FC | localhost | | N |
| *7B502VVVD8FF69164B56BCTTTT867F4B47321BA8 | 192.168.56.% | repl | N |
| *AECCEVVV63829A5F396883TTTT6F85E43C3F169C | % | flyremote | N |
| *566ACVVV7DAAAE79E247AETTTTA770E9B97D9FB0 | | flylocal | N |
| *AE162VVV68403D1D98A4C9TTTT50A508B8C56F3F | | | N |
+
-------------------------------------------+--------------+---------------+----------------+
9
rows
in
set
(0.00 sec)
|
--这样本地登录flyremote用户时 会报错,因为按以上的顺序 优先匹配到了host为localhost、user为''(空)的用户,而不是flyremote用户 (因为user为''(空)的用户可以匹配任意用户名) 。
1
2
3
|
[root@hostmysql-m mysql]# mysql -uflyremote -pFlyremote123$
mysql: [Warning] Using a
password
on
the command line interface can be insecure.
ERROR 1045 (28000): Access denied
for
user
'flyremote'
@
'localhost'
(using
password
: YES)
|
--那就是说本地登录flyremote用户时, 用匹配到的host为localhost、user为''(空)的密码 Kong123$ ,就可以正常登陆了 。
1
2
3
4
5
6
7
8
9
10
|
[root@hostmysql-m mysql]# mysql -uflyremote -pKong123$
mysql: [Warning] Using a
password
on
the command line interface can be insecure.
Welcome
to
the MySQL monitor. Commands
end
with
;
or
\g.
Your MySQL
connection
id
is
15
Server version: 5.7.23-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle
and
/
or
its affiliates.
All
rights reserved.
Oracle
is
a registered trademark
of
Oracle Corporation
and
/
or
its
affiliates. Other names may be trademarks
of
their respective
owners.
Type
'help;'
or
'\h'
for
help. Type
'\c'
to
clear the
current
input statement.
|
--查看当前用户连接方式 和 当前用户认证方式 。
1
2
3
4
5
6
7
|
mysql>
select
user
(),
CURRENT_USER
();
+
---------------------+----------------+
|
user
() |
CURRENT_USER
() |
+
---------------------+----------------+
| flyremote@localhost | @localhost |
+
---------------------+----------------+
1 row
in
set
(0.06 sec)
|
--用带入ip的方式登录flyremote用户时 无问题, ip匹配到了% ,user匹配到了flyremote 。
1
2
3
4
5
6
7
8
9
10
11
|
[root@hostmysql-m mysql]# mysql -uflyremote -pFlyremote123$ -h127.11.22.33
mysql: [Warning] Using a
password
on
the command line interface can be insecure.
Welcome
to
the MySQL monitor. Commands
end
with
;
or
\g.
Your MySQL
connection
id
is
12
Server version: 5.7.23-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle
and
/
or
its affiliates.
All
rights reserved.
Oracle
is
a registered trademark
of
Oracle Corporation
and
/
or
its
affiliates. Other names may be trademarks
of
their respective
owners.
Type
'help;'
or
'\h'
for
help. Type
'\c'
to
clear the
current
input statement.
mysql>
|
--查看当前用户连接方式 和 当前用户认证方式 。
1
2
3
4
5
6
7
|
mysql>
select
user
(),
CURRENT_USER
();
+
------------------------+----------------+
|
user
() |
CURRENT_USER
() |
+
------------------------+----------------+
| flyremote@127.11.22.33 | flyremote@% |
+
------------------------+----------------+
1 row
in
set
(0.00 sec)
|
--任意用户、任意host,只要密码和建立的第二个空用户空host的密码"doubleKong123$"匹配了, 就可以进入mysql 。
--测试一个不存在的用户hahaha 。
1
2
3
4
5
6
7
8
9
10
11
|
[root@hostmysql-m ~]# mysql -uhahaha -pdoubleKong123$ -h127.11.22.33
mysql: [Warning] Using a
password
on
the command line interface can be insecure.
Welcome
to
the MySQL monitor. Commands
end
with
;
or
\g.
Your MySQL
connection
id
is
6
Server version: 5.7.23-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle
and
/
or
its affiliates.
All
rights reserved.
Oracle
is
a registered trademark
of
Oracle Corporation
and
/
or
its
affiliates. Other names may be trademarks
of
their respective
owners.
Type
'help;'
or
'\h'
for
help. Type
'\c'
to
clear the
current
input statement.
mysql>
|
--查看当前用户连接方式 和 当前用户认证方式 。
1
2
3
4
5
6
7
|
mysql>
select
user
(),
CURRENT_USER
();
+
---------------------+----------------+
|
user
() |
CURRENT_USER
() |
+
---------------------+----------------+
| hahaha@127.11.22.33 | @ |
+
---------------------+----------------+
1 row
in
set
(0.01 sec)
|
。
1、手工删除空用户和空host用户确保安全 。
或者 。
2、使用 mysql_secure_installation 来进行安全配置 。
--安全配置如下,其中有删除匿名用户的操作 。
1
2
3
4
5
|
This program enables you
to
improve the security
of
your MySQL installation
in
the following ways:
You can
set
a
password
for
root accounts.
You can remove root accounts that are accessible
from
outside the
local
host.
You can remove anonymous-
user
accounts.
You can remove the test
database
(which
by
default
can be accessed
by
all
users, even anonymous users),
and
privileges
that permit anyone
to
access databases
with
names that start
with
test_.
|
--删除匿名用户的源码 mysql_secure_installation.cc 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//Remove anonymous users
remove_anonymous_users();
/**
Removes
all
the anonymous users
for
better security.
*/
void remove_anonymous_users()
{
int
reply;
reply= get_response((const
char
*)
"By default, a MySQL installation has an "
"anonymous user,\nallowing anyone to log "
"into MySQL without having to have\na user "
"account created for them. This is intended "
"only for\ntesting, and to make the "
"installation go a bit smoother.\nYou should "
"remove them before moving into a production\n"
"environment.\n\nRemove anonymous users? "
"(Press y|Y for Yes, any other key for No) : "
,
'y'
);
if (reply == (
int
)
'y'
|| reply == (
int
)
'Y'
)
{
const
char
*query;
query=
"SELECT USER, HOST FROM mysql.user WHERE USER=''"
;
if (!execute_query(&query, strlen(query)))
DBUG_PRINT(
"info"
, (
"query success!"
));
MYSQL_RES *result= mysql_store_result(&mysql);
if (result)
drop_users(result);
mysql_free_result(result);
fprintf(stdout,
"Success.\n\n"
);
}
else
fprintf(stdout,
"\n ... skipping.\n\n"
);
}
|
补充:mysql 用户表中多个host时的匹配规则 。
mysql数据库中user表的host字段,是用来控制用户访问数据库“权限”的.
可以使用“%”,表示所有的网段; 。
也可以使用具体的ip地址,表示只有该ip的客户端才可以登录到mysql服务器; 。
也可以使用“_”进行模糊匹配,表示某个网段的客户端可以登录到mysql服务器.
如果在user表中存在一个用户两条不同host值的记录,那么mysql服务器该如何匹配该用户的权限呢?
mysql采用的策略是:当服务器读取user表时,它首先以最具体的Host值排序(主机名和IP号是最具体的) 。有相同Host值的条目首先以最具体的User匹配.
。
如下,有两条root用户,那么只有localhost的root客户端可以登录到mysql服务器.
1
2
|
| root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root | % | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/fly43108622/article/details/84868660 。
最后此篇关于浅谈Mysql连接数据库时host和user的匹配规则的文章就讲到这里了,如果你想了解更多关于浅谈Mysql连接数据库时host和user的匹配规则的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
服务架构进化论 原始分布式时代 一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系
序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的
内容,是网站的核心所在。要打造一个受用户和搜索引擎关注的网站,就必须从网站本身的内容抓起。在时下这个网络信息高速发展的时代,许多低质量的信息也在不断地充斥着整个网络,而搜索引擎对一些高质量的内容
从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在
基本概念: 浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实
.NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography名字空间,使密码服务摆脱
文件与文件流的区别(自己的话): 在软件开发过程中,我们常常把文件的 “读写操作” ,与 “创造、移动、复制、删除操作” 区分开来
1. 前言 单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题。具体是否应该落地单元测试,以及落地的程度, 每个项目都有自己的情况。 本篇为
事件处理 1、事件源:任何一个HTML元素(节点),body、div、button 2、事件:你的操作 &
1、什么是反射? 反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 Oracle 官方对
1、源码展示 ? 1
Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。
可能大家谈到反射面部肌肉都开始抽搐了吧!因为在托管语言里面,最臭名昭著的就是反射!它的性能实在是太低了,甚至在很多时候让我们无法忍受。不过不用那么纠结了,老陈今天就来分享一下如何来优化反射!&nbs
1. 前言 最近一段时间一直在研究windows 驱动开发,简单聊聊。 对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导
问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译 ========================================================
不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境
以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木
目录 @RequestParam(required = true)的误区 先说结论 参数总结 @RequestParam(r
目录 FTP、FTPS 与 SFTP 简介 FTP FTPS SFTP FTP 软件的主动模式和被动模式的区别
1、Visitor Pattern 访问者模式是一种行为模式,允许任意的分离的访问者能够在管理者控制下访问所管理的元素。访问者不能改变对象的定义(但这并不是强制性的,你可以约定为允许改变)。对管
我是一名优秀的程序员,十分优秀!