各位用户为了找寻关于浅谈Mysql连接数据库时host和user的匹配规则的资料费劲了很多周折。这里教程网为您整理了关于浅谈Mysql连接数据库时host和user的匹配规则的相关资料,仅供查阅,以下为您介绍关于浅谈Mysql连接数据库时host和user的匹配规则的详细内容
--连接数据库时,host和user的匹配规则
官方文档:https://dev.mysql.com/doc/refman/5.7/en/connection-access.html
--host和user的匹配规则如下:
--是host为明确的最先匹配,host带%模糊的时候最后匹配,但host为''(空)位于%之后才匹配
--相同的host时候,比较user为明确的最先匹配,user为''(空)最后匹配
--相同的host和user时,排序是不确定的
? 1 2 3 4 5When
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 13mysql>
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 4mysql>
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 15mysql>
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 7mysql>
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 7mysql>
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 7mysql>
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 5This 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 havena user "
"account created for them. This is intended "
"only forntesting, and to make the "
"installation go a bit smoother.nYou should "
"remove them before moving into a productionn"
"environment.nnRemove 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.nn"
);
}
else
fprintf(stdout,
"n ... skipping.nn"
);
}
补充: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