【SQL开源代码栏目提醒】:网学会员为需要SQL开源代码的朋友们搜集整理了MySQL源码学习:MySQL中禁止跨库访问的实现 - 其它资料相关资料,希望对各位网友有所帮助!
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_accesswhile all_tablesif all_tables-db thd-db strcmpall_tables-db thd-db0 strcmpall_tables-db INFORMATION_SCHEMA_NAME.str my_errorER_DBACCESS_DENIED_ERROR MYF0thd-security_ctx-priv_user thd-security_ctx-priv_hostall_tables-dbDBUG_RETURNTRUEall_tables all_tables-next_global 说明: only_self_access 是新增的配置,表示不允许跨表访问。
thd.- lex-query_tables 是一个链表,依次存放当前
SQL 语句需要访问的表的链表table_list, 每个表的 db 字段为该表所在的库。
每个表的 next_global 指向该语句访问的下一个表。
(注意不是 next_local)
上一篇:
细看Google的35个开源项目 Go列其中
下一篇:
Function GetIp(IP) 获得ip asp