Mysql:如何防止用户只读访问所有数据库的表?

我有MySQL 5.0.82sp1运行,我注意到,所有的用户可以调用所有数据库的表上select命令。 他们没有这样的特权,所以没有什么可以撤销的。 有一些MySQL设置默认授予这种只读访问?

这似乎总是给出结果

select * from some_database_name.some_table_name

它显示了什么。

即使我通过发出命令来撤消所有权限,它也能正常工作

revoke all privileges, grant option from 'username'@'localhost';

我通过发出命令来检查它

show grants;

表明

GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD '...'

这意味着它没有select权限

由于您更改了全局权限,因此您需要执行以下操作才能生效:

  1. 发出FLUSH PRIVILEGES; 语句来重新加载授权表
  2. 断开当前客户端并重新连接

阅读更多…

有一些令人不安的事情。

我只能想到两种情况下SELECTs可以像这样运行:

状态#1:/etc/my.cnf中的skip-grant-tables

请检查/etc/my.cnf没有这个:

 [mysqld] skip-grant-tables 

如果是这样,删除skip-grant-tables行,并立即重新启动mysql。

状态#2:从命令行跳过授予表

可以使用skip-grant-tables选项启动mysql,而不用触摸my.cnf。 在Linux操作系统中,请运行以下命令:

 $ service mysql start --skip-grant-tables 

在Linux命令行中,查看是否激活skip-grant-tables ,请运行以下命令:

 $ mysqld --help --verbose | grep -C 3 "skip-grants" 

你会看到这样的线条:

 secure-file-priv (No default value) server-id 106451130 show-slave-auth-info FALSE skip-grant-tables FALSE skip-name-resolve TRUE skip-networking FALSE skip-show-database FALSE 

如果skip-grant-tables为TRUE,只要重新启动mysql即可。 它应该消失。

试一试 !!!

CAVEAT:如果这是一个MySQL / Windows问题,请检查my.ini

此外,没有全局variables来改变这个function。 这个选项只适用于mysql的启动。

更新2011-09-09 12:56 EDT

login后尝试使用此SQL命令:

 SELECT USER(),CURRENT_USER(); 

这些function报告你authentication的方式

USER()报告你如何尝试在MySQL中进行身份validation

CURRENT_USER()报告你如何被允许在MySQL中进行身份validation

请用这些发现更新您的问题!

从你的授权命令( USAGE ON *。* )看来,你已经授权访问所有的数据库。 通过限制仅访问相应用户的特定数据库来更新特权。 即USAGE ON databasename。*而不是*。*