我对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 * FROM information_schema.table_privileges;
不会返回任何结果。
我在这里缺少什么?某些事情(例如SELECT
)是否隐式授予新用户?我必须明确撤销这个吗?
如果是这样,隐式授予了哪些其他权限?
理想情况下,我的目标是除了运行我用GRANT EXECUTE ON
指定的一个(或多个)存储过程之外什么都不做的用户。
答案 0 :(得分:0)
在测试期间,我创建了一个名为“test”的模式。我不知道'test'实际上是MySQL的某种保留数据库模式名称。匿名用户可以使用它等。
因此,我在那里为测试目的创建的东西没有其他数据库可能做的某些权限限制。
我无法在此页面之外找到有关此内容的任何信息: http://www.greensql.com/content/mysql-security-best-practices-hardening-mysql-tips
该页面说它附带了它,但我很确定我的安装默认没有它。
无论哪种方式,即使删除它然后重新创建它,如果它的名称为“test”,匿名用户也可以访问它等。
我希望这对某人有所帮助,我花了太多时间对此感到困惑!
答案 1 :(得分:0)
我甚至从未想过你会在测试模式中创建生产表 - 但事实证明这是在MySQL refman中记录的(强调添加):
此外,
mysql.db
表包含允许所有帐户的行 访问名称开始的test
数据库和其他数据库 与test_
。即使是否则没有的账户也是如此 特权,例如默认的匿名帐户。这是 方便测试,但在生产服务器上不宜使用。 希望数据库访问的管理员仅限于帐户 具有为此目的明确授予的权限应该 删除这些mysql.db
表格行。
因此,这解释了您的发现“无论哪种方式,即使删除它然后重新创建它,如果它具有名称'test',匿名用户也将始终可以访问它等。”