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.
(在过去,GRANT
会 CREATE
用户;在未来(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)