zoukankan      html  css  js  c++  java
  • MySQL存储过程权限分析

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://huanghualiang.blog.51cto.com/6782683/1216786

    一、权限相关:

    1.修改sql security 

    Sql代码  

    ALTER PROCEDURE www SQL SECURITY INVOKER ;  

    ALTER PROCEDURE www SQL SECURITY DEFINER ;  

    (1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户; 

    (2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限; 

    (3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限; 

    (4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。 

    3.执行存储过程授权 

    Sql代码  

    GRANT EXECUTE ON PROCEDURE test.* TO 'wtc'@'%';  

    GRANT CREATE ROUTINE,ALTER ROUTINE, SELECT,CREATE, INSERT, UPDATE, DELETE, EXECUTE  ON test.* TO 'wtc'@'%' IDENTIFIED BY '111111'  

    CREATE ROUTINE : 创建存储过程的权限 

    ALTER ROUTINE : 修改存储过程的权限 

    二、实验:

    session 1:

    mysql> show grants for ly@'%';

    | Grants for ly@%                                                                                   

    | GRANT USAGE ON *.* TO 'ly'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' 

    mysql> show create procedure hhl.pr_param_inG

    *************************** 1. row ***************************

               Procedure: pr_param_in

                sql_mode: 

        Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_param_in`(

       in id int  

    )

        SQL SECURITY DEFINER

    begin

      INSERT INTO hhl.t  VALUES(1,'hhl'); 

    end

    character_set_client: latin1

    collation_connection: latin1_swedish_ci

      Database Collation: utf8_general_ci

    1 row in set (0.00 sec)

    grant  execute on procedure  hhl.pr_param_in to 'ly'@'%';

    session 2:

    mysql  -uly -p123 -h 1.1.1.5

    mysql> call hhl.pr_param_in(1);

    Query OK, 1 row affected (0.00 sec)

    上面 SQL SECURITY=DEFINER,ly 用户调用存储过程是以DEFINER=`root`@`localhost`,即检查调用者ly是否具有存储过程的execute权限和DEFINER用户(`root`@`localhost`)是否具有存储过程引用的相关对象的权限.

    *如果SQL SECURITY =INVOKER

    session 1 :

    mysql> ALTER PROCEDURE hhl.pr_param_in  SQL SECURITY INVOKER;

    Query OK, 0 rows affected (0.00 sec)

     

    mysql> show create procedure hhl.pr_param_inG

    *************************** 1. row ***************************

               Procedure: pr_param_in

                sql_mode: 

        Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_param_in`(

       in id int  

    )

        SQL SECURITY INVOKER

    begin

      INSERT INTO hhl.t  VALUES(1,'hhl'); 

    end

    character_set_client: latin1

    collation_connection: latin1_swedish_ci

      Database Collation: utf8_general_ci

    1 row in set (0.00 sec)

    session 2 :

    mysql> call hhl.pr_param_in(1);

    ERROR 1142 (42000): INSERT command denied to user 'ly'@'node5' for table 't'

    上面 SQL SECURITY=INVOKERly 用户调用存储过程即检查ly是否具有存储过程的execute权限和是否有存储过程引用的相关对象的权限. ly 用户确实没有对 hhl 库下的t 表insert权限。

  • 相关阅读:
    Math 类、Random 类、BigDecimal 类
    Redis 持久化原理及过期 key 清除策略
    MySql 存储引擎和索引
    MySql 视图、触发器以及存储过程
    布隆过滤器
    微信红包实现原理
    11-散列3 QQ帐户的申请与登陆 (25 分)
    11-散列2 Hashing (25 分)
    11-散列1 电话聊天狂人 (25 分)
    C语言实现Linux之ls
  • 原文地址:https://www.cnblogs.com/simplelogic/p/3412076.html
Copyright © 2011-2022 走看看