首页 > 数据库 >MySQL授权用户对存储过程查询和执行权限【转】

MySQL授权用户对存储过程查询和执行权限【转】

时间:2024-08-11 23:06:18浏览次数:7  
标签:存储 MySQL mysql 授权 权限 过程

1、授权MySQL存储过程执行权限

在项目中往往会用到存储过程来统计一些比较复杂的报表,如果数据库是mysql,则需要在执行存储过程前需要为用户添加权限,才可以,否则会提示:

mysql User does not have access to metadata required to determine stored procedure parameter types错误。

方法如下(必须俩个权限都执行,缺一不可):

1.GRANT SELECT ON mysql.proc TO 'testuser'@'%';

2.GRANT EXECUTE ON testdb.* TO 'testuser'@'%' ;

如果执行execute报错

>GRANT EXECUTE ON kams.CAL_RETURN_POINTS TO 'testuser'@'%';
ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used

# 改成
>GRANT EXECUTE ON PROCEDURE kams.CAL_RETURN_POINTS TO 'testuser'@'%';
Query OK, 0 rows affected (0.00 sec)

在sqlyog中使用testuser用户登录调用存储过程进行测试

CALL pro_get_order(1,'鲁J',258,'20170501','20170701');

测试正常了

2、授权MySQL存储过程只读查询权限

在其他RDBMS中,可以将查看某个存储过程(PROCEDURE)定义的权限给某个用户,例如在SQL Server中,可以单独将查看ProcedureName定义的权限授予UserA

GRANT VIEW DEFINITION ON ProcedureName TO UserA; --用具体的存储过程名和账号替换

那么在MySQL中能否实现这个功能呢? 找了很多资料,没有看到有这方面的功能,官方文档没有涉及这样的权限,网上有个方法:可以通过授予用户查询mysql.proc这样的权限来间接实现这个功能

grant select on mysql.proc to usrname@'xxx.xxx.xxx.xxx';

个人简单测试了一下,这样授权后,发现还是有一些其他问题。

 

mysql> show create procedure prc_insert;  --没有授权前报这个错误。
ERROR 1305 (42000): PROCEDURE prc_insert does not exist
mysql> show create procedure prc_insert\G; --授权后
*************************** 1. row ***************************
           Procedure: prc_insert
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_insert`(in  cnt int)
begin
declare i int;
set i=1;
while i < cnt do
    insert into test(id, name) select i,  CONCAT('name',i) from dual;
 
    set i = i+1;
 
end while;
end
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
 
ERROR: 
No query specified

问题1:这样授权后,你能看到所有数据库存储过程的定义(不仅仅是某个某个存储过程,或某个数据库的存储过程的定义), 这里就涉及一个权限放大的问题。例如,我本来打算只授予用户A查看存储过程PRC_A的定义权限,但是那样授权后,A能查看很多存储过程的定义,甚至还能查看一些没有访问权限数据库的存储过程的权限。严格意义上来说,这个授权是不合理,而且是有问题的。

问题2:MySQL 8.0开始抛弃了mysql.proc,而且从MySQL 8.0开始,如果你要用SHOW CREATE PROCEDURE或SHOW CREATE FUNCION的话,需要有什么权限呢?。

MySQL 8.0开始,存储过程存储在mysql.routines和mysql.parameters系统表中,但是这些表无法直接访问,只能访问INFORMATION_SCHEMA.ROUTINES。像MySQL 8.0之前那样授权行不通了,

Where are stored procedures stored?

Stored procedures are stored in the mysql.routines and mysql.parameters tables, which are part of the data dictionary. You cannot access these tables directly. Instead, query the INFORMATION_SCHEMA ROUTINES and PARAMETERS tables. See Section 25.29, “The INFORMATION_SCHEMA ROUTINES Table”, and Section 25.19, “The INFORMATION_SCHEMA PARAMETERS Table”.

You can also use SHOW CREATE FUNCTION to obtain information about stored functions, and SHOW CREATE PROCEDURE to obtain information about stored procedures. See Section 13.7.7.9, “SHOW CREATE PROCEDURE Statement”.

个人测试发现,授予alter routine后,就能查看存储过程的定义,但是这个授权也带来一个问题,授予权限的用户不仅可以查看存储过程定义,而且可以删除这个存储过程(这个也是一个问题)。这个当然,不清楚是否还有其它授权来实现。

mysql> grant alter routine on procedure MyDB.prc_2 TO test@'192.168%';
Query OK, 0 rows affected (0.08 sec)

总结:

在MySQL5.7或之前版本,可以通过授予用户查询mysql.proc来间接实现查看存储过程定义的权限,在MySQL 8.0 可以通过授予用ALTER ROUTINE的权限来间接实现查看存储过程定义的权限,两者都有一个问题,那就是会放大权限,这个属于MySQL功能性的缺陷,短时间估计一直存在


————————————————

转自

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dreamfly88/article/details/72885897

MySQL能否授予查看存储过程定义权限给用户-腾讯云开发者社区-腾讯云
https://cloud.tencent.com/developer/article/2076502

 

标签:存储,MySQL,mysql,授权,权限,过程
From: https://www.cnblogs.com/paul8339/p/18354083

相关文章

  • MySQL基础详解(3)
    文章目录索引普通索引创建索引修改表结构(添加索引)创建表的时候直接指定删除索引的语法唯一索引创建索引修改表结构创建表的时候直接指定使用ALTER命令添加和删除索引使用ALTER命令添加和删除主键显示索引信息约束非空约束:唯一约束:主键约束:外键约束:索引MySQL......
  • mysql 给了用户所有权限ALL PRIVILEGES,但是该用户没有grant权限
    在MySQL中,给用户ALLPRIVILEGES权限但没有grant权限的情况可能是因为MySQL版本的更新导致了语法的变化。在MySQL8.0及更高版本中,GRANTALLPRIVILEGES的用法已经不再支持,需要使用GRANTALLPRIVILEGESON*.*TO'username'@'host'WITHGRANTOPTION;的格式来授予用户全局权限和......
  • 【1.0版】【MYSQL安全】sql注入系列:宽字节注入
    主题sql注入系列:宽字节注入原理mysql在使用GBK编码的时候,会认为两个字符为一个汉字,例如%aa%5c就是一个汉字(前一个ascii码大于128才能到汉字的范围)。我们在过滤’的时候,往往利用的思路是将‘转换为\’因此我们在此想办法将‘前面添加的\除掉,一般有......
  • 【1.0版】【MYSQL安全】SQL注入:DNSlog外带盲注回显
    主题SQL注入:DNSlog外带盲注回显利用条件DBMS中需要有可用的,能直接或间接引发DNS解析过程的子程序,即使用到UNCLinux没有UNC路径,所以当处于Linux系统时,不能使用该方式获取数据有个重要条件:load_file()函数可以使用。也就是说需要配置文件my.ini中secure_file_priv=UNCU......
  • 【1.0版】【MYSQL安全】sql注入系列:堆叠注入
    主题sql注入系列:堆叠注入原理mysql数据库sql语句的默认结束符是以;结尾,在执行多条SQL语句时就要使用结束符隔开,那么在;结束一条sql语句后继续构造下一条语句,是否会一起执行我们发现确实同时执行了,那么在实际中我们引号闭合之后也有可能可以进行堆叠注入,但是堆叠注入和开......
  • 【1.0版】【MYSQL安全】导入导出相关操作
    主题导入导出相关操作一、load_file()二、intooutfile一、load_file()load_file(file_name):读取文件并返回该文件的内容作为一个字符串使用条件:A、必须有权限读取并且文件必须完全可读and(selectcount()frommysql.user)>0#如果结果返回正常,说明具有读写......
  • mysql 相关
    1.mysql索引1.1mysql为什么使用b+树做索引mysql的索引主要有hash索引以及B+树索引对于索引,一般就是为了加快数据访问而存在的,所以索引要求的就是效率而mysql索引数据一般是存储在磁盘的,磁盘与内存的交互存在IO,而IO是硬件问题,没法解决,剩下的能解决的也就是IO次数以及......
  • bugbountyhunter scope BARKER:第十滴血 存储型 Storage Cross-Site Scripting XSS 添
    登录后点击MemberDogs,Addyourdog头像处可以上传SVG图片检查xsspayload:https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSSInjection#xss-in-files使用SVG进行图片上传,发现SVG文件上传成功并返回图片地址poc:https://cfceb12f2bfd-sec875.a.barker......
  • 最全MySQL面试20题和答案(三)
    视图1.为什么要使用视图?什么是视图?为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。......
  • mysql数据库:DCL:管理用户,授权
    mysql数据库:DCL:管理用户,授权管理用户添加用户关闭密码复杂验证setglobalvalidate_password_policy=0;setglobalvalidate_password_length=1;语法CREATEUSER'用户名'@'主机名'IDENTIFIEDBY'密码';例子CREATEUSER'zhangsan'@'localhost&#......