PHP插入错误的密码

时间:2019-01-25 15:03:35

标签: php mysql user-permissions

我试图在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-> error;

  

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

如果我这样做;

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

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

* edit:我已经删除了事务性行为,将它从实时代码中删除并不能解决问题。看来密码字符串已在PHP和MySQL之间更改了?

2 个答案:

答案 0 :(得分:2)

通常,事务控制命令与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中,'customer'已创建,没有权限。 在mysql.db表中,已创建具有权限的“客户”和“管理员”。

答案 1 :(得分:0)

此外,大多数数据库的确存在限制。但是出于调试目的和学习目的,您可以启用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