mariadb, PHP7 -- 不能授予所有数据库权限

Posted

技术标签:

【中文标题】mariadb, PHP7 -- 不能授予所有数据库权限【英文标题】:mariadb, PHP7 -- cannot grant all DB privs 【发布时间】:2019-12-28 03:35:21 【问题描述】:

在我的 php 代码中,我尝试了该指令的各种迭代:

        $dbc->exec("CREATE DATABASE $dbName;
                    CREATE USER '$user'@'%' IDENTIFIED BY '$pass';
                    GRANT ALL ON $dbName.* to '$user'@'%' IDENTIFIED BY '$pass';
                    FLUSH PRIVILEGES;")

而且,通过迭代,我的意思是调整 db 权限值:

`$dbName`.* $dbName.* $dbName '$dbName'.* 等等……

对于所有尝试,我最终得到了一个使用 GRANT USAGE 语句创建的用户,并且与目标数据库 ($dbName) 未绑定(关联)。

我唯一一次成功地将权限级别更改为 *.* 为我试图避免的该用户授予所有数据库的所有内容;我想将授权仅限于命名数据​​库。相反,当我执行 GRANT ALL 或 GRANT ALL PRIVILEGES 时,每次都会得到这个结果:

MariaDB [(none)]> show grants for someAdmin@localhost;
+-------------------------------------------------------------------------------+
| Grants for someAdmin@localhost       
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'someAdmin'@'localhost' IDENTIFIED BY PASSWORD '[snip]' |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)

我也尝试在发出命令后重新启动 mariadb,以查看重新启动是否会强制执行正确的 privs,但不会。

向新用户 s.t. 授予数据库所有权限(带有授予选项)的正确 SQL 是什么?用户实际上被授予了对指定数据库的所有权限

(PHP 7.2、MariaDB 10.1、Ubuntu 18.04)

来自 MariaDB 文档:

使用 *.* 为 priv_level 授予全局权限。全球的 权限包括管理数据库和管理的权限 用户帐户,以及所有表、函数和 程序。全局权限存储在 mysql.user 表中。

使用 db_name.* 为 priv_level 授予数据库权限,或者 仅使用 * 来使用默认数据库。数据库权限包括 创建表和函数的权限,以及创建表和函数的权限 数据库中的所有表、函数和过程。数据库 权限存储在 mysql.db 表中。

【问题讨论】:

我建议将每一行分开到他们自己的查询中,而不是全部作为一个传递。它可能不会运行所有行。 单独执行查询会产生相同的结果。 介意 SQL 注入?还要考虑不要从应用程序代码中创建 MySQL 用户,因为它不安全.. 意见。既不相关也不有用。 SQL injections 评论非常相关,因为您的代码看起来很容易出现这种情况。这不是意见.. 【参考方案1】:

你试过去掉“%”吗?

最好也添加本地主机。 See this SO

【讨论】:

【参考方案2】:

这个查询组合对我有用:

            $dbc->exec("CREATE DATABASE $dbName;
                        CREATE USER '$user'@'$host' IDENTIFIED BY '$pass';
                        GRANT ALL PRIVILEGES ON $dbName.* to '$user'@'$host' IDENTIFIED BY '$pass';
                        FLUSH PRIVILEGES;")

用户以 wildcard:$dbname 权限绑定到新创建的数据库。深入挖掘,我看到用户拥有所有能力,包括在新数据库中创建索引和数据库对象的能力,除了授权,这是我真正需要的。在全球范围内,新用户仍然具有“使用”级别的权限,这也是可取的。

感谢您的问题和帮助 - 它让我的大脑开始尝试不同的事情!

【讨论】:

【参考方案3】:
'$user'@'%'
'someAdmin'@'localhost'

'%'包含'localhost',而是包含其他所有内容。

正常模式是

CREATE USER            'user'@'...' IDENTIFIED BY '...';
GRANT ALL ON 'db'.* TO 'user'@'...';
                       ^^^^^^^^^^^^
                       These must match exactly.

(在过去,GRANTCREATE 用户;在未来(MySQL 8.0)不会。MariaDB 最终可能会朝这个方向发展。)

对于ON 'db'.*,dbname 是可选的。 (如果没有引用,请注意某些标点符号。)* 是一个通配符,意思是“所有 db”。

我认为这种上下文允许使用双引号、单引号或反引号来引用。

【讨论】:

sql 指令中的用户名完全匹配。我尝试了几种使用单引号、反引号和无引号的变体,但它仍然无法创建数据库范围的权限,而是仅授予使用权限。最初,代码使用 localhost 和 '%' 创建了两个用户帐户,然后对这两个帐户执行了授权语句。这当然不能正常工作,提示减少单个用户的代码以试图使其成功工作。抱歉,但这不是解决方案。如果代码按照文档执行,应该是这样。 @MichealShallop - “主机”必须完全匹配。 @MichealShallop - 重新开始,准确完整地列出(密码除外)为创建帐户而发出的命令,以及失败的连接尝试。

以上是关于mariadb, PHP7 -- 不能授予所有数据库权限的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP7 在 MariaDB 中的 MySQLi 和 PDO

Centos7 配置LAMP+fastcgi(Centos7.2+php7.0+mariadb+httpd)

Linux下对MySQL/MariaDB数据库的基本操作以及linux mysql添加用户,删除用户,以及用户权限的授予

CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架

Ubuntu 16.04 LAMP server 指南 - 配置 Apache2.4,PHP7,和MariaDB(而不是MySQL)

LNMP 源码安装 超详细笔记记录 PHP7 MariaDB 10.1.12