数据库授权,禁止某个表的删除功能

12 篇文章 0 订阅
1 篇文章 0 订阅

一个网站通常使用一个mysql身份连接数据库,然后进行各种增删改查操作。比如phpcms系统。但最近遇到个问题,那就是phpcms的操作日志是可以删除的。而实陆路上,为了安全,操作日志要设定为不允许删除,就是任何管理员都不能删除操作日志,以便事后有记录可查。可是,用户授权是按数据库授权的。整个数据库中的表都有删除功能,要取消了,则新闻资讯会员管理评论等需要删除功能也不能用。所以,实现起来,也不是那么容易的。经过一阵折腾,终于解决。特作记录。
1,首先查看用户权限:

show grants for  userxx

结果返回两行记录
第一行是创建用户及密码的。
第二是权限的:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `db`.* TO 'userxx'@'%';

就是db库中所有表授权了。
2,尝试取消v9_log 表的授权:

REVOKE ALL PRIVILEGES ON `db`.v9_log FROM 'userxx'@'%'; 

提示操作成功。但测试发现还是可以删除。
刷新表缓存,测试无效。
有的说更改权限后要重新连接才能生效,重启mysql,测试还是无效。

咨询专业人员和查询网络,专业人员测试后也说还是要按表授权。反正我测试了按库授权后,取消单个表的权限无效果。然后测试发现,重复授权是可以的,提示成功,不过权限记录并没有增加,也就是,第二次授权如果跟你第一次授权一样,则还是保留那个授权,如果没有,则增加那个授权。就是说,授权是合集关系,多次授权取合集。并不是类似ip防火墙那样是层层过滤关系:前面放行了后面有拦的,仍会拦下。而数据库是并集,有一处授权就有权了。可能是这个原因吧。

3,按表授权?可是phpcms自己带有几百个表,加上表单生成的表,目前已经500多个了。给每个表授权,得把所有表名找出来,再来授权,这不把人累死?
于是想到个反向的办法:
先给数据库授权时,不给delete权限,再来给需要的表授权。理论上说,这样的工作量小些。
于是建了个新账号来测试:

GRANT SELECT, INSERT, UPDATE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `db`.* TO 'userxx'@'%';

测试成功,确实不能删除了。
不过,测试一开始就遇到问题了。刷新页面就报错。phpcms后台操作,可能每次都要replceinto处理v9_senssion表。replceinto实际是先删除后插入。所以报错。
4,给v9_senssion授权:

GRANT DELETE ON `app`.`v9_session` TO 'userxx'@'%';

测试成功。v9_senssion可以删除,不再报错。

那其它哪些表还要delete权限呢?这一个个去找也不是事啊。

5,网上找了一圈,也没找到排除某个表给整个数据库授权的办法。不过在老外网站找到一条命令:

SELECT CONCAT("GRANT DELETE ON app.", table_name, " TO 'user'@'%';") FROM information_schema.TABLES WHERE table_schema = "db" AND `table_name <>“排除表”;

这一看也不是操作命令啊,只是一个select命令。
操作后提示执行成功,哇,有500多条记录。这是授权成功了吗?也不对啊,只是select啊。查看一下权限,权限并没有变化。

细看之下,它只是一个批量生成授权命令的语句。也就是生成了500多张表的授权命令。还是要把这些命令拿到mysql中去执行。

唉,还是回到按表授权的老路了。不过,这样一次生成,复制到命令行窗口执行一次就行了,还是方便多了。

6,最后将批量生成的表授权命令导出,然后选择一些认为必须授权的复制过去执行。测试授权成功,可以删除。
尽管回到按表授权老路,还是简便多了。

如果大家有更好的排除某个表授权的办法,麻烦告知,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值