【问题标题】:User with no permissions can still SELECT没有权限的用户仍然可以选择
【发布时间】:2013-07-27 15:34:26
【问题描述】:

我对 MySQL 还很陌生,我一直在创建测试表等。

无论如何,我创建了一个新用户,使用

CREATE USER 'myUser'@'localhost' IDENTIFIED BY 'myPassword';

现在,当我登录这个用户时,我可以从我之前用 root 创建的表中SELECT。这肯定不可能吗?用户没有SELECT 权限,或者实际上没有任何权限。如果(以 root 身份登录)我会:

SHOW GRANTS FOR 'myUser'@'localhost';

或者

SELECT * FROM information_schema.user_privileges WHERE grantee LIKE "'myUser'@%";

我可以看到他们只有 USAGE 权限。我的理解是设置此权限以指示用户没有权限。

那么这个用户是如何从我的表中进行 SELECT 的呢?

如果我这样做:

SELECT * FROM information_schema.table_privileges;

不返回任何结果。

我在这里缺少什么?像SELECT 这样的某些东西是否隐式授予新用户?我必须明确撤销吗?

如果是这样,还有哪些其他权限被隐式授予?

理想情况下,我的目标是让用户除了运行我用GRANT EXECUTE ON 指定的一个(或多个)存储过程之外什么都不做。

【问题讨论】:

  • 您可能不确切知道您连接的是哪个用户/主机;检查SELECT CURRENT_USER();
  • 我得到 'myUser@localhost' 这是我所期望的。但是,如果事情按我想象的那样工作,我不应该被拒绝这样做吗?阻止所有SELECT 查询,包括那个查询和表?
  • 这不是“真正的”SELECT(即不访问表)——(伪)授权 USAGE 允许您登录数据库服务器,但仅此而已。
  • 好吧,我仍然可以对那个用户进行SELECT * FROM MyTable;

标签: mysql select permissions grant


【解决方案1】:

我什至从未想过您会在测试模式中创建生产表——但事实证明这在 MySQL refman 中有记录(强调添加):

此外,mysql.db 表包含允许所有帐户的行 访问test 数据库和其他名称以开头的数据库 与test_。即使对于其他没有的帐户也是如此 特殊权限,例如默认匿名帐户。这是 便于测试,但不建议在生产服务器上使用。 希望仅对帐户进行数据库访问的管理员 具有为此目的明确授予的权限的应 删除这些mysql.db 表行。

这解释了您的发现“无论哪种方式,即使删除它然后重新创建它,如果它的名称为 'test',匿名用户等始终可以访问它。”

【讨论】:

  • 这对于新版本的 MySQL 是否仍然准确?我在我的 MySQL 实例中没有看到这方面的条目
【解决方案2】:

在测试期间,我创建了一个名为“test”的架构。我不知道,“测试”实际上是 MySQL 的某种保留数据库模式名称。匿名用户可以使用等。

因此,我在那里创建的用于测试目的的东西没有其他数据库会做的某些权限限制。

在此页面之外,我真的找不到任何关于此的信息: http://www.greensql.com/content/mysql-security-best-practices-hardening-mysql-tips

那个页面说它是自带的,但我很确定我的安装默认没有它。

无论哪种方式,即使删除它然后重新创建它,如果它的名称为“test”,匿名用户等始终可以访问它。

我希望这对某人有所帮助,我花了太长时间来困惑这个问题!

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2012-10-19
    • 1970-01-01
    • 2013-09-21
    • 2021-12-07
    相关资源
    最近更新 更多