Mysql数据库“消失”的对象校验

文章目录

  • 一、前言
  • 二、问题
  • 三、问题排查
  • 四、解决方式
    • 1.存储过程和函数的definer:
    • 2.修改event的definer:
    • 3.修改view的definer:
  • 五、结束语

一、前言

最近在配合系统开发商进行上线的过程中,遇到了一个问题,从这个问题上,可以看到mysql数据库中虽然尽可能的想要为我们提供一些更加安全、便捷的功能,但是貌似却仍然存在一些不合理之处。

环境如下:

名称意义
A用户1
B用户2
DB1数据库1
DB2数据库2
VIEW1视图1
TABLE1表1

二、问题

根据业务需求,我对A做了如下的权限分配:

>show grants for A;| Grants for A@%                                    |
+-----------------------------------------------------------+
| GRANT USAGE ON *.* TO 'A'@'%'                             |
| GRANT SELECT ON `DB1`.* TO 'A'@'%'                        |
| GRANT ALL PRIVILEGES ON `DB2`.* TO 'A'@'%'                |
| GRANT SELECT ON `DB3`.* TO 'A'@'%'                        |
+-----------------------------------------------------------+
6 rows in set (0.00 sec)

在整个环境中,DB1中存在部分业务表以及业务视图;当我通过用户A查询DB1中的表时,数据库中的表可以正常查询:

>select count(*) from A.TABLE1;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

但是当我查询DB1中的视图时,却发现报如下错误:

>select count(*) from DB1.VIEW1;
ERROR 1045 (28000): Access denied for user 'A'@'%' (using password: YES)

可以发现,虽然已经成功登陆了A用户,但是当查询视图的时候,却提示一个看起来是登陆失败的问题。

虽然,已经给了用户DB1的所有对象读权限,但是为什么在查询视图的时候会有这样的报错提示呢?难道视图在MYSQL中被设计成单独的权限控制么?

带上面的两个疑问,进行进一步测试和分析。

三、问题排查

对于这个问题的排查,首先怀疑是权限没有设置正确。因此,再次给A用户单独分配DB1的VIEW1查询权限:

grant select on DB1.VIEW1 to 'A'@'%';

经过测试,发现问题依旧存在;

进一步,赋予用户A更大权限进行测试:

grant all on *.* to 'A'@'%';

发现虽然权限已经最大了,但是还是报同样的错误;

于是,直接以root用户登陆数据库,执行测试:

>mysql -uroot -p
>select count(*) from DB1.VIEW1;ERROR 1449 (HY000): The user specified as a definer ('B'@'%') does not exist

发现此时的报错变了,错误信息非常明确,即指定definer(‘B’@‘%’)不存在。

因此,我对VIEW的定义进行查询:

>show create view DB2.VIEW1;
.....
CREATE ALGORITHM=UNDEFINED DEFINER=`B`@`%` SQL SECURITY DEFINER VIEW `A`.`VIEW1` 
AS 
select `A`.`TABLE1`.`datatimestamp` AS `datatimestamp`,
`A`.`TABLE1`.`sessionid` AS `sessionid`,
`A`.`TABLE1` .`agentid` AS `agentid`,
`A`.`TABLE1` .`ringdialtimestamp` AS `ringdialtimestamp`,
`A`.`TABLE1` .`establishedtimestamp` AS `establishedtimestamp`,
`A`.`TABLE1` .`releasedtimestamp` AS `releasedtimestamp` 
from `A`.`TABLE1`
where 
((`A`.`TABLE1` .`userdata` is not null) 
and (`A`.`TABLE1` .`userdata` <> '')) 
order by `A`.`TABLE1`.`dbid` 
desc limit 0,60
...

可以发现,这个视图里面的DEFINER为B@%,而我们对数据库中的用户表进行查询,确实发现没有B@%:

select * from performance_schema.user\G

后续,经过对系统的初始化脚本检查发现,在数据初始化脚本中发现有如下的信息:

-- Final view structure for view `VIEW1`
-- Final view structure for view `VIEW1`
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`B`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `A`.`VIEW1` AS 
select `A`.`TABLE1`.`datatimestamp` AS `datatimestamp`,
`A`.`TABLE1`.`sessionid` AS `sessionid`,
`A`.`TABLE1` .`agentid` AS `agentid`,
`A`.`TABLE1` .`ringdialtimestamp` AS `ringdialtimestamp`,
`A`.`TABLE1` .`establishedtimestamp` AS `establishedtimestamp`,
`A`.`TABLE1` .`releasedtimestamp` AS `releasedtimestamp` 
from `A`.`TABLE1`
where 
((`A`.`TABLE1` .`userdata` is not null) 
and (`A`.`TABLE1` .`userdata` <> '')) 
order by `A`.`TABLE1`.`dbid` 
desc limit 0,60*/;
/*!50001 SET character_set_client      = @saved_cs_client */;
/*!50001 SET character_set_results     = @saved_cs_results */;
/*!50001 SET collation_connection      = @saved_col_connection */;

这个脚本是系统开发商从开发测试上直接导出的sqlfile,在开发测试环境中B用户是存在的,但是上生产前提出的需求并没有创建这个用户。

从上面的脚本中看,起初第一眼看到了/* */这样的标注,下意识的就认为,这个只是个注释,不会被执行,但后续了解到/*!50013*/表示的意思是在5.0.0.13版本后,这部分内容就会被执行。因此,会出现这些视图虽然在A用户下,但是DEFINER则是B用户,最终导致我们出现上述的情况。

四、解决方式

产生这种情况后,我们需要修改definier,而在mysql中,对于不同的对象的definer修改具有不同的方式

1.存储过程和函数的definer:

select definer from mysql.proc;
update mysql.proc set definer=`A`@`%`;

2.修改event的definer:

select DEFINER from mysql.EVENT;
update mysql.EVENT set definer=`A`@`%`;

3.修改view的definer:

select DEFINER from information_schema.VIEWS;
alter DEFINER=`A`@`%` SQL SECURITY DEFINER VIEW mydb.myview as select * from mytable;如果有很多,需要批量修改,则需要拼接sql:select concat("alter DEFINER=`A`@`%` SQL SECURITY DEFINER VIEW ", TABLE_SCHEMA, ".",TABLE_NAME, " as ", VIEW_DEFINITION, ";") from information_schema.VIEWS where DEFINER = 'B@%';

五、结束语

在Mysql中,缺失了一些对数据库对象校验的机制,比如上述的definer对象的问题、赋权的问题(我可以将一个不存在的对象成功赋予用户),从而导致一些不可预期的错误,而且普通用户下相应的报错日志也并不明确,排查起来具有一定的迷惑性。由于这些错误只有在使用的时候才可能会被触发。因此,我们在进行部署、迁移时候还是需要对这些点做一些细致的检查,或者充分的功能测试。

目前国产化中也有很多基于Mysql作为底座的数据库。因为用的比较少,所以不知道这样的校验机制缺失是否在这些数据库中有所缺失。但是,完善这样的数据库对象校验机制,其实对于使用着、维护者来说还是可以避免很多的坑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SaaS] 家作->装修设计师

淘宝设计AI&#xff0c;人人都能成为装修设计师构建用户对未来家的想象&#xff0c;是家装家居多年来持续探索的方向&#xff0c;如今我们用AI帮助用户“更快、更好、更简单”看到自己未来的家。https://mp.weixin.qq.com/s/Pk1xztEd17JefXp79FHKNA其实就是个商品白底图inpaint…

SQLiteC/C++接口详细介绍-sqlite3类(一)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口简介 下一篇&#xff1a;SQLiteC/C接口详细介绍&#xff08;二&#xff09; 引言&#xff1a; SQLite C/C 数据库接口是一个流行的SQLite库使用形式&#xff0c;它允许开发者在C和C代码中嵌…

WPF布局、控件与样式

视频来源&#xff1a;https://www.bilibili.com/video/BV1HC4y1b76v/ 布局 常用布局属性 HorizontalAlignment&#xff1a;用于设置元素的水平位置VerticalAlignment&#xff1a;用于设置元素的垂直位置Margin&#xff1a;指定元素与容器的边距Height&#xff1a;指定元素的…

如何在Flutter中实现网络请求

在Flutter中实现网络请求有很多模块&#xff0c;可以使用http模块&#xff0c;也可以使用dio模块。 具体的用法在https://pub.dev/上面有&#xff0c;我们以前的的项目中用的是Dio库&#xff0c;它支持get post put delete还支持文件的上传下载。 import ‘package:dio/dio.d…

LeetCode hot100-11

239. 滑动窗口最大值给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。我的解法会超时&#xff0c;就比最暴力解法优化了一点点吧…

如何解决awtk动态图锯齿状

打开awtk安装目录sdk->awtk->awtk_config.py,找到该位置 VGCANVAS NANOVG # VGCANVASNANOVG_PLUS if OS_NAME Windows: TK_ROOT TK_ROOT.replace(\\, \\\\) NANOVG_BACKEND GLES2 else: NANOVG_BACKEND GL3 # VGCANVASCAIRO 注释掉 # NANOVG_BACKENDGLES2 # N…

uni-app开发介绍以及代码案例

uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;它允许开发者编写一套代码&#xff0c;然后将其发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;如微信、支付宝、百度等&#xff09;等多个平台。uni-app在开发者数量、案例、跨…

解决驱动开发中<stdlib.h> no such file 的问题

前言 在进行驱动开发时&#xff0c;需要使用malloc等函数&#xff0c;导入C库<stdlib.h>出现bug。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论…

LeetCode 每日一题 2024/3/4-2024/3/10

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/4 232. 用栈实现队列3/5 1976. 到达目的地的方案数3/6 2917. 找出数组中的 K-or 值3/7 2575. 找出字符串的可整除数组3/8 2834. 找出美丽数组的最小和3/9 2386. 找出数组…

深度学习十大算法-快速掌握!

自2006年深度学习概念被提出以来&#xff0c;20年快过去了&#xff0c;深度学习作为人工智能领域的一场革命&#xff0c;已经催生了许多具有影响力的算法。那么&#xff0c;你所认为深度学习的top10算法有哪些呢&#xff1f; 以下是大力哥我心目中的深度学习top10算法&#xff…

python中列表常用函数

列表list相关函数 列表相关函数 列表相关函数 汇总&#xff1a;. 列表: 1.list() 方法用于将序列&#xff08;元组&#xff0c;集合&#xff0c;字符串等&#xff09;转换为列表。 用法&#xff1a;list( seq ) #seq为序列&#xff1a;元组 集合 字符串等 2.列表定义&a…

案例分析篇09:Web架构设计相关20个考点(7~11)(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

研究生预答辩全解析

下午参加了预答辩&#xff0c;顺利通过&#xff01;非常开心&#xff0c;做一点小小的分享。 关于如何顺利通关学位论文预答辩&#xff01; 首先&#xff0c;预答辩最重要的两样东西是论文和演讲PPT。这是需要精心准备的&#xff0c;你用不用心&#xff0c;老师一眼就…

github 中的java前后端项目整合到本地运行

前言: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

ES6:箭头函数中的this指向问题

普通函数中的this指向函数的调用者 例子&#xff1a; 黑马程序员的说法&#xff1a;箭头函数不会创建自己的this&#xff0c;它只会从自己的作用域链的上一层沿用this 尚硅谷的说法&#xff1a;this始终指向函数声明时所在作用域下的this的值 通俗理解就是箭头函数中找this&…

Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程

Linux使用MCSM面板搭建我的世界(Minecraft)整合包服务器&#xff0c;MC开服教程&#xff0c;All the Mods 9(ATM9)整合包搭建服务器的教程。 本教程使用Docker来运行mc服&#xff0c;可以方便切换不同Java版本&#xff0c;方便安装多个mc服版本。 视频教程&#xff1a;https:…

vue3+ts+element-plus实际开发之统一掉用弹窗封装

vue3tselement-plus实际开发之统一掉用弹窗封装 插槽1. 官网介绍先理解 插槽、具名插槽、 作用域插槽、动态插槽名、具名作用域插槽属性和使用方法 2. 统一调用弹窗封装dome实战- 使用场景&#xff1a;- 对el-dialog进行数据动态设置- 新建一个ts文件用于统一存放组件&#xff…

设备维修带来的无限价值——易点易动设备管理系统的优势

在化工工厂中&#xff0c;设备的正常运行是保障生产顺利进行的关键。然而&#xff0c;设备难免会出现故障和损坏&#xff0c;而及时有效的设备维修对于提高生产效率和降低成本至关重要。为了解决这一问题&#xff0c;易点易动设备管理系统应运而生&#xff0c;以其卓越的功能和…

【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用

【微服务学习笔记&#xff08;一&#xff09;】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂&…

【漏洞复现】畅捷通T+ GetStoreWarehouseByStore接口处存在反序列化RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…