【问题标题】:mariadb, PHP7 -- cannot grant all DB privsmariadb, PHP7 -- 不能授予所有数据库权限
【发布时间】: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 评论非常相关,因为您的代码看起来很容易出现这种情况。这不是意见..

标签: php mysql mariadb


【解决方案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 - 重新开始,准确完整地列出(密码除外)为创建帐户而发出的命令,以及失败的连接尝试。
      猜你喜欢
      • 2014-08-16
      • 2015-01-23
      • 2014-02-04
      • 2021-02-05
      • 2011-06-28
      • 1970-01-01
      • 2021-06-20
      相关资源
      最近更新 更多