MySQL源码学习:MySQL中禁止跨库访问的实现

 先说一下这里“跨库”的意思:当前use的是db1, 仍可以使用select * from db2.table1来访问table1表。

这样使得我们需要访问同一个MySQL下的其他表时不需要多一次use,也使得多个库间的表join这样的操作成为可能。

1、 问题背景

但有些使用场景下是有禁掉这种功能的需求。比如一些开放应用托管服务,一般给一个应用指定使用一种类型的db, 多个用户使用相同的应用,但每个用户访问自己的db。由于有复用连接的需求,使得不能给连接的mysqluser作库权限限制。对于指定一个新用户连接后,强行use db来控制其只能在这个db中操作。

这时候如果允许上面说的这种SQL语句,就会导致一个用户可以访问其他用户的数据。

2、 简单方案

1) 不允许应用端使用use语句

2) 在MySQL里面对于跨表的访问,直接拒绝。

当然如果原意在中间层作SQL解析,然后判断使用的表也行。如果允许改一点MySQL代码可以如下;


all_tables= thd.-> lex->query_tables;

if (only_self_access)

{

while (all_tables)

{

if (all_tables->db && thd->db && strcmp(all_tables->db, thd->db)!=0 && strcmp(all_tables->db, INFORMATION_SCHEMA_NAME.str) )

{

my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),

thd->security_ctx->priv_user, thd->security_ctx->priv_host, all_tables->db);

DBUG_RETURN(TRUE);

}

all_tables= all_tables->next_global;

}

说明: only_self_access是新增的配置,表示不允许跨表访问。

thd.-> lex->query_tables 是一个链表,依次存放当前SQL语句需要访问的表的链表(table_list),

每个表的db字段为该表所在的库。

每个表的next_global指向该语句访问的下一个表。(注意不是next_local)

时间: 2024-08-03 17:43:40

MySQL源码学习:MySQL中禁止跨库访问的实现的相关文章

Mysql源码学习笔记 偷窥线程_Mysql

感觉代码有些凌乱,注释代码都写的比较随意,好像没有什么统一的规范,不同的文件中代码风格也有差异,可能Mysql经过了很多牛人的手之后,集众牛人之长吧.也可能是我见识比较浅薄,适应了自己的代码风格,井底之蛙了,总之还是怀着敬畏的心情开始咱的源码之旅吧.本人菜鸟,大神轻拍. Mysql可以启动起来了,应该怎么学习呢?总不能从main开始一步一步的看吧,Mysql作为比较底层的大型软件,涉及到数据库实现的方方面面,没有厚实的数据库理论基础和对Mysql各个模块相当的熟悉,从main开始势必会把自己引入

MySQL源码学习: concat + outfile的bug 原因分析

项目中碰到一个bug,需要将MySQL表中的数据导出,字段中间用逗号隔开. 1.复现 步骤: 版本 5.1.48 a) 准备数据 CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `data` char(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk; insert into tad2 values (1,'丁\\奇'); b) select concat(id, data) from te

MySQL源码学习:ib_logfile、bin-log与主从同步

今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭.会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行? 这会导致主从不一致. 本文简要说明下这个问题. 1. 写入流程 源码sql/handler.cc: ha_commit_trans { - if ((err= ht->prepare(ht, t

MySQL源码学习:简述InnoDB的BP LRU策略

本文简要说明InnoDB的Buffer Pool(BP)的结构.基本运行方式和策略. 1.LRU的基本形态 由于涉及到淘汰机制,Buffer Pool (BP)内需要一个LRU链.这个LRU链表的基本形态如下: 从图中看到,LRU是一个链表(双向,图中没有画出反向指针). 同时有一个LRU_old(buf_pool->LRU_old)指针指向链表中间的一个page. LRU_old指向的page及之后直到end的page,都被称为"old page", 内存中bpage->

MySQL · 源码分析 · MySQL 半同步复制数据一致性分析

简介 MySQL Replication为MySQL用户提供了高可用性和可扩展性解决方案.本文介绍了MySQL Replication的主要发展历程,然后通过三个参数rpl_semi_sync_master_wait_point.sync_binlog.sync_relay_log的配置简要分析了MySQL半同步的数据一致性. MySQL Replication的发展 在2000年,MySQL 3.23.15版本引入了Replication.Replication作为一种准实时同步方式,得到广泛

MySQL · 源码分析 · MySQL BINLOG半同步复制数据安全性分析

半同步复制(semisynchronous replication)MySQL使用广泛的数据复制方案,相比于MySQL内置的异步复制它保证了数据的安 全,本文从主机在Server层提交事务开始一直到主机确认收到备机回复进行一步步解析,来看MySQL的半同步复制是怎么保证数 据安全的.本文基于MySQL 5.6源码,为了简化本文只分析DML的核心的事务处理过程,并假定事务只涉及innodb存储引擎. MySQL的事务提交流程 在MySQL中事务的提交Server层最后会调用函数ha_commit_

MySQL源码学习:关于慢查询日志中的Rows_examined=0

最近在一个项目中DBA同学问了一个问题:为什么很多慢查询日志中显示 Rows_examined : 0? 需要说明的是, 这类慢查询语句都是类似 select count(*) from (-)t; 在说明这个问题之前,我们先指出两个相关背景: 1.MySQL的临时表,都是MyISAM的. 2.MyISAM表中的记录总数是额外存储的,count(*)的时候不需要遍历数据. 3.把count(*)转换为取一个const值这件事情,是在优化(optimize)阶段作的. 问题分析: 这个值对应于代码

MySQL源码学习:InnoDB的ib_logfile写入策略

ib_logfile是InnoDB的事务日志文件.本文简要说明其写入时机.写入策略及如何保证数据安全. 1. 基本概念 a) ib_logfile文件个数由innodb_log_files_in_group配置决定,若为2,则在datadir目录下有两个文件,命令从0开始,分别为ib_logfile0和ib_logfile. b) 文件为顺序写入,当达到最后一个文件末尾时,会从第一个文件开始顺序复用. c) lsn: Log Sequence Number,是一个递增的整数. Ib_logfil

MySQL源码学习:关于整型判断的一个bug

问题: 这个bug来源于官方的一个bug报告,感谢@印风_小希 . 现象很容易描述,直接上例子. 5.1以后的版本都有此问题. CREATE TABLE `tb` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into tb values (1,2),(2,5),(3,8),(4,6); select * from t