MySQL源码学习:MySQL中禁止跨库访问的实现
摘要:??先說一下這里“跨庫”的意思:當(dāng)前use的是db1, 仍可以使用select * from db2.table1來訪問table1表。 這樣使得我們需要訪問同一個(gè)MySQL下的其他表時(shí)不需要多一次use,也使得多個(gè)庫間的表join這樣的操作成為可能。
?先說一下這里“跨庫”的意思:當(dāng)前use的是db1,?仍可以使用select * from db2.table1來訪問table1表。
這樣使得我們需要訪問同一個(gè)MySQL下的其他表時(shí)不需要多一次use,也使得多個(gè)庫間的表join這樣的操作成為可能。
1、?問題背景
但有些使用場(chǎng)景下是有禁掉這種功能的需求。比如一些開放應(yīng)用托管服務(wù),一般給一個(gè)應(yīng)用指定使用一種類型的db,?多個(gè)用戶使用相同的應(yīng)用,但每個(gè)用戶訪問自己的db。由于有復(fù)用連接的需求,使得不能給連接的mysqluser作庫權(quán)限限制。對(duì)于指定一個(gè)新用戶連接后,強(qiáng)行use db來控制其只能在這個(gè)db中操作。
這時(shí)候如果允許上面說的這種SQL語句,就會(huì)導(dǎo)致一個(gè)用戶可以訪問其他用戶的數(shù)據(jù)。
2、?簡(jiǎn)單方案
1)?不允許應(yīng)用端使用use語句
2)?在MySQL里面對(duì)于跨表的訪問,直接拒絕。
當(dāng)然如果原意在中間層作SQL解析,然后判斷使用的表也行。如果允許改一點(diǎn)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?是一個(gè)鏈表,依次存放當(dāng)前SQL語句需要訪問的表的鏈表(table_list),
每個(gè)表的db字段為該表所在的庫。
每個(gè)表的next_global指向該語句訪問的下一個(gè)表。(注意不是next_local)
總結(jié)
以上是生活随笔為你收集整理的MySQL源码学习:MySQL中禁止跨库访问的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL SELECT..INTO O
- 下一篇: MySQL数据库MVCC多版本并发控制简