【发布时间】: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 评论非常相关,因为您的代码看起来很容易出现这种情况。这不是意见..