首页 > 数据库 > > 23.6 存储程序和视图的访问控制
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html
存储的程序和视图在使用之前定义,并且在引用时,在确定其权限的安全上下文中执行。 这些权限由其DEFINER属性控制,如果存在,则由SQL SECURITY特性控制。
所有存储的程序(过程,函数,触发器和事件)和视图都可以具有命名MySQL 用户的DEFINER属性。 如果从存储的程序或视图定义中省略了DEFINER属性,则默认帐户是创建该对象的用户。
此外,存储的例程(过程和函数)和视图可以具有SQL SECURITY特性,其值为DEFINER或INVOKER,以指定对象是在定义者还是调用者上下文中执行。 如果省略SQL SECURITY特性,则缺省值为definer 文本。
触发器和事件没有SQL SECURITY特性,并始终在definer上下文中执行。 服务器根据需要自动调用这些对象,因此没有调用用户。
定义者和调用者安全上下文的不同之处如下:
请考虑以下存储过程:
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p1()
SQL SECURITY DEFINER
BEGIN
UPDATE t1 SET counter = counter + 1;
END;
具有p1的EXECUTE特权的任何用户都可以使用CALL语句调用它。 但是,当p1执行时,它会在definer安全上下文中执行,因此以“admin”@“localhost”(DEFINER属性中指定的帐户)的权限执行。 此帐户必须具有p1的EXECUTE特权以及表t1的UPDATE特权。 否则,该过程失败。
现在考虑这个存储过程,它与p1相同,只是它的SQL SECURITY特性是INVOKER:
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p2()
SQL SECURITY INVOKER BEGIN
UPDATE t1 SET counter = counter + 1;
END;
与p1不同,p2在调用者程序安全上下文中执行。 DEFINER属性无关紧要,p2以调用用户的权限执行。 如果调用者缺少p2的EXECUTE特权或表t1的UPDATE特权,则p2失败。
MySQL使用以下规则来控制用户可以在对象DEFINER属性中指定的帐户:
要最大程度地降低存储程序和视图创建和使用的潜在风险,请遵循以下准则:
但是,触发器不存在这种控制,因为用户不直接引用它们。 触发器总是在定义器上下文中执行,并通过访问与其关联的表来激活,甚至是没有特殊权限的用户进行的普通表访问。 如果DEFINER帐户具有高权限,则触发器可以执行敏感或危险操作。 如果创建触发器所需的SUPER和TRIGGER权限从创建它的用户的帐户中撤消,则仍然如此。 管理员应特别注意授予用户权限的组合。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3160136/ ,如需转载,请注明出处,否则将追究法律责任。