MySQL如何授予函数执行权限并避免越权

小伟小哥_5281

小伟小哥_5281

2026-09-02

203人浏览

原创

execute权限仅对指定数据库和函数名生效,不支持全局通配;必须显式授予如grant execute on function mydb.my_func to 'user1'@'localhost',且函数名大小写需与show function status一致。

mysql如何授予函数执行权限并避免越权

EXECUTE权限只对具体函数生效,不能跨库或全局授予

给用户授予EXECUTE权限时,MySQL要求明确指定函数所在的数据库和函数名,不支持EXECUTE ON *.*这种写法。否则会报错:ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES。

  • 正确写法是:GRANT EXECUTE ON FUNCTION mydb.my_func TO 'user1'@'localhost';
  • 如果函数在test库,但用户被授权的是mydb库的EXECUTE,调用时仍会报ERROR 1370 (42000): execute command denied to user
  • 函数名区分大小写(取决于系统变量lower_case_table_names),授权时必须与SHOW FUNCTION STATUS中显示的完全一致

CREATE ROUTINE权限 ≠ EXECUTE权限,两者必须分开授予

开发人员创建函数需要CREATE ROUTINE,但调用者只需要EXECUTE。很多团队误以为给了CREATE ROUTINE就自动获得执行权,结果导致调用失败。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • CREATE ROUTINE允许创建/修改函数,但不赋予执行能力
  • 用户A创建了函数mydb.calc_tax,用户B即使有EXECUTE ON FUNCTION mydb.calc_tax,也必须由DBA显式授权,不能靠“创建者默认可执行”机制
  • 若函数定义中包含SQL SECURITY DEFINER,执行时检查的是定义者的权限,而非调用者——这是越权高发点

SQL SECURITY DEFINER容易引发隐式越权

当函数以DEFINER方式创建(默认行为),其执行权限基于函数所有者的权限,而不是调用者。这意味着一个只有SELECT权限的用户,可能通过调用某个DEFINER函数间接执行UPDATE或读取其他库数据。

  • 检查函数定义:SHOW CREATE FUNCTION mydb.my_func;,关注SQL SECURITY字段
  • 生产环境强烈建议统一使用SQL SECURITY INVOKER,让函数权限严格受限于调用者已有权限
  • 若必须用DEFINER,定义者账号应为专用低权限账号(如func_runner@localhost),且该账号不应拥有FILE、SUPER等高危权限

角色绑定后必须显式激活才能生效

MySQL 8.0角色不会自动激活,即使已用GRANT role_name TO user绑定,用户连接后仍需执行SET ROLE role_name或SET ROLE ALL,否则EXECUTE等权限不生效。

  • 验证是否激活:SELECT CURRENT_ROLE();,返回NULL说明未激活
  • 避免在应用连接池中遗漏该步骤——连接复用时角色状态不会自动继承
  • 可通过SET DEFAULT ROLE role_name TO user设为默认角色,减少每次连接的手动激活
函数权限不是“一授永逸”的配置,SQL SECURITY模式、角色激活状态、函数定义变更都会动态影响执行边界。最常被忽略的是DEFINER函数在权限继承链中的穿透效应——它让EXECUTE变成一把双刃剑。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2053

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1259

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

735

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2732

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4548

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1059

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4811

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4302

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5594

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 282人学习