MySQL源码学习:MySQL中禁止跨库访问的实现
摘要:??先說一下這里“跨庫”的意思:當前use的是db1, 仍可以使用select * from db2.table1來訪問table1表。 這樣使得我們需要訪問同一個MySQL下的其他表時不需要多一次use,也使得多個庫間的表join這樣的操作成為可能。
?先說一下這里“跨庫”的意思:當前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)
總結
以上是生活随笔為你收集整理的MySQL源码学习:MySQL中禁止跨库访问的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL SELECT..INTO O
- 下一篇: MySQL数据库MVCC多版本并发控制简