mysql只读账号查看视图创建函数_Mysql 存储过程、函数、触发器和视图的权限检查...

MySQL默认在执行存储过程时检查创建者的权限,即使用户没有直接访问表的权限,也能通过存储过程访问。这可能导致安全隐患。为解决此问题,可以使用`DEFINER`或`SQL SECURITY INVOKER`选项。`DEFINER`指定执行时使用定义者的权限,而`SQL SECURITY INVOKER`确保执行者需具备相应权限。对于触发器和事件,由于没有调用者概念,无法设置SQL SECURITY。
摘要由CSDN通过智能技术生成

当存储过程、函数、触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的?

在默认情况下,MySQL将检查创建者的权限。假设用户A创建了存储过程p()访问表T,并把execute的权限赋给了B,即使用户B没有访问表T的权限,也能够通过执行存储过程p()访问表T。

下面看一个例子:

首先,我们创建一个表test.t和两个用户a,b,并把权限赋予用户a

root@(none) 05:39:45>createtableportal.tasselect*frommysql.user;

Query OK, 25 rowsaffected (0.16 sec)

Records: 25  Duplicates: 0  Warnings: 0

root@(none) 05:39:55>createusera identifiedby'a';

Query OK, 0 rowsaffected (0.02 sec)

root@(none) 05:40:51>createuserb identifiedby'b';

Query OK, 0 rowsaffected (0.00 sec)

root@(none) 05:40:59>grantallprivilegesonportal.*toa;

Query OK, 0 rowsaffected (0.01 sec)

接着,以用户a创建存储过程p():

DELIMITER $$

USE portal$$

CREATEPROCEDURE`p`()

BEGIN

SELECTCOUNT(*)FROMportal.t;

END$$

DELIMITER ;

并把执行该存储过程的权限赋给用户b:

root@(none) 05:54:28>grantexecuteonprocedureportal.ptob;

Query OK, 0 rowsaffected (0.00 sec)

这时候,已用户b连接后通过执行存储过程可以获得t表的访问权限:

b@(none) 05:58:20>call portal.p();

+----------+

| COUNT(*) |

+----------+

|       25 |

+----------+

1 row inset(0.00 sec)

Query OK, 0 rowsaffected (0.00 sec)

但如果直接访问将出现权限错误:

b@(none) 05:58:40>selectcount(*)fromportal.t;

ERROR 1142 (42000): SELECTcommand deniedtouser'b'@'192.168.1.15'fortable't'

MySQL这样的设置有一定的道理,但同时也带来了安全隐患:比如如果一个用户通过创建一个存储过程来访问敏感数据,则可以调用该存储过程的所有用户都能访问敏感数据。

如果你不想使用MySQL的默认设置,可以在定义存储程序和视图时在create语句里使用definer = account字句指定定义者,这样在执行存储程序和视图时,将检查definer的权限,而不是创建者的权限。

举个例子,当你用root 创建一个存储过程时,在默认情况下,在执行该存储过程时,执行者将获得root的权限,但当你加上definer = A后,执行者只能获得A的权限。

但是definer还是没能完全解决上面提到的安全隐患,别急,MySQL还提供了SQL SECURITY选项来控制权限,它有两个取值:

1)DEFINER:以定义者的权限执行(默认)

2)INVOKER:以调用者的权限执行

如果你不想在存储程序或试图在执行时的权限多于调用者,就设置SQL SECURITY INVOKER即可。

例如,下面的试图将访问mysql.user,并设置了SQL SECURITY INVOKER选项,这样如果调用者没有访问mysql.user的权限,则无法通过权限检查。

createsql security invokerviewv

asselect*frommysql.user;

注意:因为触发器和事件是由系统调用的,没有调用者的概念,所以它们没有SQL SECURITY选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值