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权限。

  • 相关阅读:
    poj 2676 Suduku (dfs)
    poj 1562 Oil Deposits (dfs)
    poj 2907 Collecting Beepers (dfs)
    poj 1655 Balancing Act (树形dfs)
    poj 3411 Paid Roads (dfs)
    hdu 2896 病毒侵袭 (AC)
    hdu 3065 病毒侵袭持续中 (AC)
    poj 2251 Dungeon Master (bfs)
    java中debug使用
    Swing入门级小项目总结
  • 原文地址:https://www.cnblogs.com/simplelogic/p/3412076.html
Copyright © 2011-2022 走看看