0

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

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

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

现在,当我登录到这个用户时,我可以SELECT从我之前用 root 创建的表中。这肯定不可能吗?用户没有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

4

2 回答 2

0

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

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

所以这解释了你的发现“无论如何,即使删除它然后重新创建它,如果它的名称为'test',匿名用户等总是可以访问它。”

于 2013-07-28T18:18:02.580 回答
0

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

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

除了这个页面,我真的找不到任何信息:http: //www.greensql.com/content/mysql-security-best-practices-hardening-mysql-tips

该页面说它附带它,但我很确定我的安装默认没有它。

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

我希望这对某人有所帮助,我花了太长时间对此感到困惑!

于 2013-07-27T21:40:41.923 回答