mysql如何限制用户对INFORMATION_SCHEMA的访问_控制元数据可见性

云杰君_6094

云杰君_6094

2026-04-23

478人浏览

原创

mysql 8.0.12+ 可直接执行 revoke select on information_schema.* from 'user'@'%';,该操作有效且自动生效;5.7 及更早版本不支持此语法,需通过严格限定业务库权限并禁用 show databases 等方式间接限制。

mysql如何限制用户对information_schema的访问_控制元数据可见性

MySQL 8.0+ 能否直接 REVOKE SELECT ON INFORMATION_SCHEMA.*

可以,但仅限 MySQL 8.0.12 及以上版本。执行 REVOKE SELECT ON INFORMATION_SCHEMA.* FROM 'user'@'%' 是有效的,且会立即阻止该用户查询 INFORMATION_SCHEMA.TABLES、INFORMATION_SCHEMA.COLUMNS 等视图。

常见错误现象:
– 在 MySQL 5.7 或更早版本执行该语句会报错 ERROR 1044 (42000): Access denied for user,因为旧版本不支持对 INFORMATION_SCHEMA 显式授权/回收;
– 即使在 8.0+,若用户已有全局权限(如 SELECT ON *.*),REVOKE 必须完全匹配原 GRANT 范围,否则无效。

实操建议:
– 先确认版本:SELECT VERSION();
– 检查当前授权:SHOW GRANTS FOR 'user'@'%';
– 若存在 GRANT SELECT ON *.*,必须先 REVOKE SELECT ON *.* FROM 'user'@'%',再单独授业务库表权限;
– 执行 REVOKE SELECT ON INFORMATION_SCHEMA.* FROM 'user'@'%' 后无需 FLUSH PRIVILEGES(GRANT/REVOKE 自动生效)。

为什么 SHOW DATABASES 还能看到库名,即使没给 INFORMATION_SCHEMA 权限

因为 SHOW DATABASES 的可见性不依赖 INFORMATION_SCHEMA,而取决于用户是否拥有任意一个数据库的 USAGE 或其他权限。只要用户对某个库有 SELECT、INSERT 等权限,SHOW DATABASES 就会列出所有他“能访问”的库名——这是 MySQL 的默认行为。

真正屏蔽库名的方法只有一种:skip-show-databases。

实操建议:
– 在 my.cnf 的 [mysqld] 段落中添加:skip-show-databases;
– 重启 MySQL 服务(必须重启,动态 SET 不生效);
– 验证效果:用受限用户登录后执行 SHOW DATABASES,应返回空结果集;
– 注意:skip-show-databases 对 root 或拥有 SUPER 权限的用户无效,所以务必确保应用账号无 WITH GRANT OPTION 或 SUPER。

information_schema_stats_expiry = 0 是不是能防元数据探测

不能防,只能干扰。设 SET PERSIST information_schema_stats_expiry = 0 会让统计信息(如 TABLE_ROWS、索引基数)每次查询都实时计算,增加探测延迟和服务器负载,但不会隐藏表名、列名或结构本身。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

它不影响 SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'mydb' 这类基础查询——只要用户有对应库的 SELECT 权限,这条语句依然能跑通(除非已 REVOKE 掉 INFORMATION_SCHEMA 权限)。

实操建议:
– 别把它当安全措施,只是辅助扰动手段;
– 优先级远低于:显式 REVOKE SELECT ON INFORMATION_SCHEMA.* + skip-show-databases + 限制业务库范围;
– 如果应用不需要统计信息(如报表系统不依赖 TABLE_ROWS),可设为 0;否则保持默认(如 86400 秒)更省资源。

低版本 MySQL(5.7)如何等效限制 INFORMATION_SCHEMA 访问

MySQL 5.7 不支持 REVOKE SELECT ON INFORMATION_SCHEMA.*,也不能靠权限回收实现,唯一有效路径是「切断元数据来源」:让用户对任何数据库都没有全局权限,且不授予 SHOW DATABASES 权限,并确保其只能访问明确指定的单个数据库。

关键点在于:MySQL 5.7 的 INFORMATION_SCHEMA 是按用户实际可访问的库动态生成的。如果用户只被授予 myapp_db.users 的 SELECT 权限,那 SELECT * FROM INFORMATION_SCHEMA.TABLES 返回的就只有 myapp_db 下的表——但这仍可能泄露表名。要彻底压制,必须配合应用层约束或代理层过滤。

实操建议:
– 创建用户时不用 GRANT ... ON *.*,严格限定到库表:GRANT SELECT ON myapp_db.users TO 'app'@'%';
– 显式回收可能残留的权限:REVOKE ALL PRIVILEGES ON *.* FROM 'app'@'%';
– 确保未授予 SHOW DATABASES、PROCESS、REPLICATION CLIENT 等辅助权限;
– 在应用连接串中加 database=myapp_db,并用 USE myapp_db 初始化,默认库缺失会降低跨库尝试成功率;
– 最终防线:在中间件(如 ProxySQL)或 ORM 层禁止含 INFORMATION_SCHEMA、mysql.、performance_schema. 的查询关键词。

INFORMATION_SCHEMA 不是普通数据库,它的内容是用户权限的镜像。想让它“空”,核心不是删它、锁它,而是让用户的权限范围足够窄——窄到连一张额外的表都够不到。这点在 MySQL 5.7 和 8.0 上逻辑一致,只是 8.0 多了道显式回收的保险栓。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3369

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2368

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1300

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1258

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1376

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2258

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3660

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

16915

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 190人学习