Firefox linux 程序员 mysql apache HTML5 java Ubuntu Windows Python wordpress centos google Android 开源 nginx 微软 linux命令 shell php

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

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

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

一、问题背景

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

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

二、简单方案

  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)

延伸阅读

评论