【问题标题】:PHP inserting incorrect passwordPHP插入错误的密码
【发布时间】:2019-06-19 10:35:19
【问题描述】:

我正在尝试在 PHP7.0 中在运行时创建一个 mysql 用户帐户,授予对单个数据库的访问权限,该数据库也是在运行时创建的。 我目前正在使用:

$this->mysqli = new mysqli('localhost', $admin_account, $password);

$setup = [
    /* create database */
    sprintf('CREATE DATABASE IF NOT EXISTS %s;', $dbName),
    /* grant admin */
    sprintf("GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%s' WITH GRANT OPTION;", $dbName, $admin_account, $admins_remote_ip),
    /* add user */
    sprintf("CREATE USER '%s'@'localhost' IDENTIFIED BY '%s';", $dbUsername, $dbPassword),
    /* THIS WAS ADDED AS A FIX TO NO AVAIL */
    sprintf("UPDATE mysql.user SET password=PASSWORD('%s') WHERE user='%s'", $dbPassword, $dbUsername),
    /* grant retailer*/
    sprintf("GRANT ALL PRIVILEGES ON %s.* TO '%s'@'localhost';", $dbName, $dbUsername),
    /* flush */
    "FLUSH PRIVILEGES;",
];



foreach ($setup as $query) {
    if (false == $this->mysqli->query($query)) {
        $error = $this->mysqli->error;
        return $error;
    }
}

所有语句都执行没有错误,一切似乎都在它应该的位置,但是非管理员用户得到一个 mysql->错误;

连接失败:用户 'dbUsername'@'localhost' 的访问被拒绝(使用密码:YES)

如果我这样做;

> mysql -u admin_account -p
update mysql.user set password=PASSWORD('dbPassword') where user='dbUsername';

然后连接正常,一切正常。 请帮忙。

*edit:我已经删除了事务行为,从实时代码中删除它并没有解决问题。密码字符串似乎在 PHP 和 MySQL 之间的某个地方被更改?

【问题讨论】:

  • 您检查过mysqli 是否返回任何错误消息吗?
  • UPDATE mysql.user … 语句应该有什么用?上面那个,CREATE USER … IDENTIFIED BY 'password' 应该已经在创建用户时为用户设置了密码......?
  • 请注意 - 事务和 DDL 语句并不能真正协同工作。
  • 是的,我正在检查错误,并添加了 UPDATE mysql.user 行来修复或进一步检查错误。
  • 如果您的密码中有单引号怎么办?出于对安全的热爱,请使用mysqli_real_escape_string 逃避您的输入。另请注意,您可以在单个查询中执行授权:GRANT ALL PRIVILEGES ON %s.* TO '%s'@'localhost' IDENTIFIED BY '%s' 将一次性创建用户、授予访问权限并设置密码。

标签: php mysql user-permissions


【解决方案1】:

大多数情况下,事务控制命令与 DML 命令一起使用,例如 - INSERT、UPDATE 和 DELETE。如果您在创建或删除表时使用它们,结果可能取决于自动提交模式。默认情况下, 自动将更改永久提交到

如果您阅读文章“How Popular Databases Deal with DDL Commands in Transactions”,您会注意到并非所有数据库都能够回滚 DDL 更改。它们确实支持 DDL 命令事务性,但并不支持所有命令。

您还会在MySQL Internals Manual 中发现,使用非事务性引擎的 DDL 语句和操作不会在事务列表中“注册”。检查您正在使用的引擎(InnoDB 或 MyISAM)。

我已经在中复制了纯粹的例子,发现FLUSH一定是原因。这在手册中得到确认。 The FLUSH statement causes an implicit commit.

START TRANSACTION;
CREATE DATABASE IF NOT EXISTS StackOverflow;
GRANT ALL PRIVILEGES ON  StackOverflow.* TO 'admin'@'%' WITH GRANT OPTION;
CREATE USER 'customer'@'localhost' IDENTIFIED BY 'customer';
GRANT ALL PRIVILEGES ON StackOverflow.* TO 'customer'@'localhost';
COMMIT;
FLUSH PRIVILEGES;

在表 mysql.user 中创建了没有权限的“客户”。 在 mysql.db 表中,'customer' 和 'admin' 已被创建并具有权限。

【讨论】:

  • 感谢您的回复,从上面的代码中删除事务并没有解决问题。
【解决方案2】:

此外,确实大多数数据库都有限制。但是出于调试和学习的目的,您可能会在 mysql 中启用常规日志(这将记录所有查询)。

它会产生很大的开销并且不符合生产要求,但它可以快速简便地修复开发环境中的错误。

使用@foxfabi 数据库示例的名称,从您的查询中得到以下输出:

2019-01-28T10:08:44.791816Z    55 Connect   root@localhost on  using Socket
2019-01-28T10:08:44.792076Z    55 Query CREATE DATABASE IF NOT EXISTS StackOverflow
2019-01-28T10:08:44.792556Z    55 Query GRANT ALL PRIVILEGES ON StackOverflow.* TO 'root'@'1.1.1.1' WITH GRANT OPTION
2019-01-28T10:08:44.792839Z    55 Quit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多