`
丁林.tb
  • 浏览: 797234 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL权限控制的设计缺陷?

阅读更多

这个问题是从被问到information_schema.user_privilegeIS_GRANTABLE字段问题开始查起的,就先从user_privilege表的显示规则说起。

 

1、              IS_GRANTABLE字段

root账号执行如下语句(本文中grant后都接flush privileges, 不赘述)

a) grant all privileges on *.* to `myuser`@localhost with grant option;

 

b) select user,select_priv from mysql.user where user='myuser';

+------------------------------+----------------------------+

| user               | select_priv        |

+------------------------------+----------------------------+

| myuser            | Y                      |

+------------------------------+----------------------------+

 

c) select PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '\'myuser\'@\'localhost\'' and PRIVILEGE_TYPE = ‘SELECT’;

+------------------------------+----------------------------+

| PRIVILEGE_TYPE     | IS_GRANTABLE     |

+------------------------------+----------------------------+

| SELECT                    | NO                         |

+------------------------------+----------------------------+

   

 

说明: b)myuser已经有了select_priv。而c) IS_GRANTABLENO,这不是显示错误。 实际上,IS_GRANTABLE并非表示用户是否“拥有此权限”,而是表示用户是否拥有“将此权限赋予其他用户”的权限。它对应的是mysql.user表中的grant_priv字段,此时为NO

  

2user_privileges的显示规则

       当我们创建一个新用户create user myuser2;  时,在mysql.user中看到这个用户的所有权限都为NO,此时user_privileges增加一行

+---------------------+-----------------------+--------------------------+---------------------+

| GRANTEE     | TABLE_CATALOG | PRIVILEGE_TYPE  | IS_GRANTABLE  |

| 'myuser2'@'%' | NULL          | USAGE          | NO           |.

+---------------------+-----------------------+--------------------------+---------------------+

 

什么时候显示USAGE 这篇文章中我们知道对应的显示控制代吗在sql/sql_show.cc 对应的函数为fill_schema_schema_privileges

简单分析源码得到规则如下:

 

    PRIVILEGE_TYPE规则:

       a) 当该用户没有权限,或只有grant_priv的时候,PRIVILEGE_TYPE显示为USAGE

       b) 否则按顺序显示被赋予的权限,每行一个,这些权限包括

UPDATE_ACL | SELECT_ACL | INSERT_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL |  LOCK_TABLES_ACL | EXECUTE_ACL | CREATE_VIEW_ACL | SHOW_VIEW_ACL | CREATE_PROC_ACL | ALTER_PROC_ACL | EVENT_ACL | TRIGGER_ACL), GRANT权限不显示。

 

   IS_GRANTABLE规则:若该用户有grant_priv权限,则在列出的所有行的IS_GRANTABLE都显示YES,否则显示NO

 

================================标题党的分割线================================

 

3、权限控制问题

       从上面的分析中我们知道,用户是否拥有给其他用户赋权的权限,取决于这个用户本身是否拥有grant_priv权限。用一个字段控制一批权限,这样就联想到可能有一个“权限混乱“的现象。

       首先,授权必然是要有范围限制的。用户A赋权给用户B,这些赋予的权限不能超过A的权限范围。

       看以下的操作序列。使用root账户登录。

mysql> grant select,insert,delete,update on *.* to `grant_u2`@localhost  ;     

Query OK, 0 rows affected (0.00 sec)

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

mysql> select * from information_schema.user_privileges where grantee like '%gran_u%';

Empty set (0.01 sec)

 

mysql> select GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '%grant_u%';

+--------------------------------+----------------------------+--------------------+

| GRANTEE            | PRIVILEGE_TYPE   | IS_GRANTABLE |

+--------------------------------+----------------------------+--------------------+

| 'grant_u1'@'localhost' | SELECT            | YES         |

| 'grant_u2'@'localhost' | SELECT            | NO         |

| 'grant_u2'@'localhost' | INSERT            | NO         |

| 'grant_u2'@'localhost' | UPDATE           | NO         |

| 'grant_u2'@'localhost' | DELETE            | NO         |

+-------------------------------+-------------------------------+-------------------+

 

    说明:上面的操作中,我们给grant_u1赋了查询权限且with grant option. grant_u2赋了增删改查权限,但没有grant权限。

information_schema.user_privileges看出目前权限状态正常。

 

    之后用grant_u1登录, select的“赋权”权限赋给grant_u2.

mysql> grant select on *.* to `grant_u2`@localhost with grant option  ;                    

Query OK, 0 rows affected (0.00 sec)

mysql> select GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '%grant_u%';

+--------------------------------+----------------------------+--------------------+

| GRANTEE            | PRIVILEGE_TYPE   | IS_GRANTABLE |

+--------------------------------+----------------------------+--------------------+

| 'grant_u1'@'localhost' | SELECT            | YES         |

| 'grant_u2'@'localhost' | SELECT            | YES         |

| 'grant_u2'@'localhost' | INSERT            | YES         |

| 'grant_u2'@'localhost' | UPDATE           | YES         |

| 'grant_u2'@'localhost' | DELETE            | YES         |

+-------------------------------+-------------------------------+-------------------+

5 rows in set (0.00 sec)

 

    从结果看出,grant_u2用户拥有了对增删改查的赋权权限。这个已经超出了grant_u1的权限范围。

 

进一步的,再用grant_u2登录,执行grant select,insert,delete,update on *.* to `grant_u1`@localhost with grant option ; grant_u1用户也拥有了增删改查的赋权权限。

实际上,root账号设置的权限中,grant_u1grant_u2都没有对增删改的赋权权限,但经过上述操作后,这两个用户的权限都扩大了,且超过了原有权限的并集。

 

4、分析

实际上这个问题的根源,就在于MySQL在设计上用一个grant_priv来控制是否有赋权权限,而每个概念上将每个权限分开。导致在grant_u1将“查询赋权”权限赋给grant_u2的时候,附带的将其他权限也带进去了。

2
1
分享到:
评论
1 楼 飞鸿无痕 2012-07-12  
对于第一点,select PRIVILEGE_TYPE, IS_GRANTABLE from information_schema.user_privileges where grantee like '\'myuser\'@\'localhost\'' and PRIVILEGE_TYPE = ‘SELECT’;的结果IS_GRANTABLE应该为YES才对吧。因为你上面有加with grant option选项.

相关推荐

    JSP+MYSQL软件缺陷管理系统的设计与实现

    "JSP+MYSQL软件缺陷管理系统的设计与实现"是一个基于Web的项目,它利用JSP(JavaServer Pages)作为前端开发技术,MySQL作为后端数据库管理系统,来构建一个高效、可靠的缺陷跟踪和管理平台。下面我们将深入探讨这个...

    MySQL数据库的权限及其安全缺陷 (1).pdf

    MySQL数据库的权限系统是其安全性的重要组成部分,它允许管理员精细控制不同用户对数据库资源的访问。MySQL提供了15种不同的权限,包括select、insert、update、delete等基本的数据操作权限,以及index、alter、...

    MySQL数据库的权限及其安全缺陷.pdf

    MySQL数据库的权限及其安全缺陷.pdf

    基于ssm+mysql软件缺陷管理系统设计与实现.docx

    SSM+MySQL软件缺陷管理系统设计与实现 随着信息化时代的飞速发展,计算机技术在各行各业的应用日益广泛,软件作为其中的核心部分,其质量直接影响到企业的运营效率和服务质量。软件缺陷管理系统在此背景下应运而生...

    基于SSM+Mysql的软件缺陷管理系统.zip

    基于SSM+MySQL的软件缺陷管理系统是一个用于跟踪和管理软件开发过程中的缺陷和问题的在线平台。...用户权限管理:系统支持多级用户权限管理,可以根据用户角色进行权限的分配和控制,确保数据的安全性和机密性。

    利用RBAC扩展MySQL访问控制机制.pdf

    传统的访问控制机制存在一些缺陷,例如基于用户的访问控制机制,无法满足复杂的访问控制需求。为此,基于角色的访问控制机制(RBAC)被提出,以提高访问控制的灵活性和安全性。 RBAC机制的核心思想是将访问权限与角色...

    276ssm_mysql_jsp 软件缺陷管理系统.zip(可运行源码+sql文件+文档)

    设计出一个及时对缺陷进行跟踪、缺陷管理、度量等功能的基于SSM的软件缺陷管理系统,帮助企业及时找到软件缺陷并找到方案进行解决。 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所...

    276ssm-mysql-jsp 软件缺陷管理系统.zip(可运行源码+数据库文件+文档)

    设计出一个及时对缺陷进行跟踪、缺陷管理、度量等功能的基于SSM的软件缺陷管理系统,帮助企业及时找到软件缺陷并找到方案进行解决。 本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所...

    MySql 5.1 参考手册.chm

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    基于ssm+mysql软件缺陷管理系统源码数据库文档.zip

    权限控制通常采用角色-权限模型,确保不同用户对缺陷信息有不同的操作权限。日志记录则有助于追踪系统运行状况和问题排查。异常处理则能保证系统在出现错误时,仍能提供友好的反馈信息。 在实际使用中,该系统可能...

    MySQL 5.1参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关...

    基于ssm+mysql软件缺陷管理系统源码数据库.doc

    根据提供的文档信息,我们可以深入探讨基于SSM框架与MySQL数据库构建的软件缺陷管理系统的设计与实现。此系统旨在通过计算机技术提升软件质量,并有效追踪、记录和解决软件中的各种缺陷问题。 ### 一、SSM框架简介 ...

    JIRA+MYSQL配置

    首先,JIRA是一个项目管理工具,广泛应用于敏捷开发领域。它可以通过敏捷看板、缺陷跟踪、...此外,对JIRA和MYSQL的配置都应当考虑安全性问题,确保数据库密码安全、数据库访问权限控制得当,以避免潜在的安全风险。

    ssm+mysql的软件缺陷管理系统(源码+lw+ppt)

    该系统采用MySQL作为数据库进行数据存储,设计简洁实用,方便企业对软件项目中的缺陷进行全生命周期管理。 适用人群: 系统主要面向软件开发企业的项目经理、调试员和解决方案人员。它帮助企业中的开发团队高效追踪...

    MySQL 5.1中文手冊

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    MySQL 5.1官方简体中文参考手册

    7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息...

    基于ssm+mysql软件缺陷管理系统源码数据库论文.doc

    6. **信息管理**:系统提供信息管理功能,包括用户管理、权限控制和日志记录,确保只有授权的人员能访问和修改缺陷信息,同时记录所有的操作以便审计和追踪。 7. **软件跟踪**:软件跟踪功能允许系统记录缺陷的整个...

    基于SSM+Mysql的软件缺陷管理系统(源码+论文+开题报告+演示视频).zip

    本系统一共分为管理员、项目经理、调试员以及解决方案人员四大角色,每个角色所...本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点。

Global site tag (gtag.js) - Google Analytics