为什么在MySQL中使用Wildcard通配库名授权会导致权限溢出

雨墨姑娘_8486

雨墨姑娘_8486

2026-10-28

745人浏览

原创

MySQL库名中的%和_是通配符,未转义时会按LIKE规则匹配,如app%授权所有以app开头的库,db_1匹配任意单字符,必须双写反斜杠转义为db\\_1才能表示字面量。

为什么在mysql中使用wildcard通配库名授权会导致权限溢出

MySQL库名里的%和_是通配符,不是字面量

执行 GRANT SELECT ON `app%`.* TO 'u'@'%' 时,MySQL 不会把它当作一个叫 app% 的库名,而是按 LIKE 规则做模式匹配——它实际授权的是所有以 app 开头的库:app_db、app123、app-test、app0x 全算。这不是疏忽,是权限解析器的默认行为。

下划线 _ 同理:GRANT SELECT ON `db_1`.* 匹配的是 db01、dba1、db-1,因为 _ 表示“任意单字符”。不转义就等于主动扩大权限边界。

  • 必须写成 `db_1`(反斜杠转义),且 SQL 字符串中要双写反斜杠,即实际执行为 GRANT SELECT ON `db\_1`.*
  • 用 SHOW GRANTS FOR 'u'@'%' 确认输出里显示的是 `db_1`,而不是 `db_1`,才算生效
  • 哪怕库名里只含一个 _ 或 %,只要没转义,就已开启通配匹配

撤销权限时通配符必须完全一致,否则静默失败

如果当初用 GRANT SELECT ON `db\_1`.* TO 'u'@'%' 授权,那撤销时必须严格写 REVOKE SELECT ON `db\_1`.* FROM 'u'@'%'。漏掉反斜杠、写成 `db_1`、或主机名部分不一致(比如原是 'u'@'192.168.%' 却写成 'u'@'%'),MySQL 都不会报错,也不会撤销——权限继续生效,你却以为已经清掉了。

  • 执行 REVOKE 前,务必先运行 SHOW GRANTS FOR 'u'@'%',复制粘贴输出中的完整对象名(含转义符号)
  • 撤销后立刻再查一遍 SHOW GRANTS,确认对应行已消失
  • 不要手动重写语句,复制粘贴是最安全的做法

通配库名 + 通配主机名 = 权限爆炸式扩散

'u'@'%' AND `app%`.* 这种组合,相当于同时放开两个维度的模糊匹配:任意 IP 可连 + 任意以 app 开头的库可读。一旦数据库暴露在边界网络,攻击者只要拿到账号密码,就能遍历所有匹配库,包括本不该访问的测试库、备份库、甚至其他租户的库(如 app_tenant_a、app_tenant_b)。

MySQL
MySQL

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

下载
  • 生产环境禁止 GRANT ... ON `app%`.*,必须明确写出库名并加反引号:`app_db`
  • 真需批量覆盖,先用 SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME LIKE 'app%' 查出实际匹配列表,人工核对
  • 主机名也一样:'u'@'192.168.5.%' 比 'u'@'%' 安全得多,但前提是该子网内无其他非信任节点

权限叠加让问题更难察觉

一个用户可能同时有 GRANT SELECT ON `app%`.* 和 GRANT SELECT ON `prod_orders`.*,而 prod_orders 正好匹配 app% 模式——这时你删掉后者,权限依然存在。更麻烦的是,MySQL 不会告诉你哪些权限来自通配匹配,SHOW GRANTS 只显示最终合并结果。

  • 查隐式权限:运行 SELECT Db, Select_priv FROM mysql.db WHERE User='u' AND Host='%',看是否有未预期的库级记录
  • 避免混用通配与精确授权,尤其是跨版本迁移后,老权限可能残留
  • 最稳妥的做法:删除所有含通配符的授权,重建为精确库名 + 精确主机名

真正危险的不是用了通配符,而是不知道它正在匹配什么。每次写 GRANT 或 REVOKE,只要对象名里出现 % 或 _,就必须停下来确认是否已转义、是否必要、是否可被枚举验证。

相关文章

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

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

下载

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4583

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1209

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6561

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3323

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6520

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8961

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1210

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

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

精品课程

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

共1课时 | 193人学习