内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。
在一个项目的预商用环境下,我搭建的数据库都是以“test_”开头的,昨天应开发要求给创建了一个只有select权限的用户以供查看数据排错,但是奇怪的事情就发生了,开发过一会儿跟我说用这个账户可以修改数据!
我自己试了一下尼玛果然可以,于是各种排查,最后锁定在数据库名称上,因为只要新建了用户,在不赋予任意权限之前都可以操作这项目所属的几个数据库,而对于其它数据库则规规矩矩来。然后请教别人,在官方的操作手册里指出grant命令创建权限时注意数据库名称里的通配符“_”和“%”要及时转义,但是经排查测试发现并不是匹配问题,于是继续疯狂搜索,终于找着一篇帖子:http://space.itpub.net/7607759/viewspace-676674
- mysql.user表决定是否允许或拒绝到来的连接。对于允许的连接,user表授予的权限指出用户的全局(超级用户)权限。这些权限适用于服务器上的all数据库。
- mysql.db表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。
看到这里,我们找到原因了!原来在mysql里默认以test开头的数据库能被任意可登陆用户访问操作!具体可以select * from mysql.db where user=''\G看一下。
“从权限上来看,host为%,user为空,这就说明了不限制的,所有能连接到MySQL的用户,几乎都拥有test库的所有权限”于是我推测出奇怪问题的服务器之前在安装Mysql后没有执行mysql_secure_installation命令,而只是单纯删除了test数据库,再对比执行过安全初始化的mysql,其中mysql.db表里已经没有了test记录。
另外,以后建立数据库不要随便以“test”开头了。