PHP вставляет неверный пароль - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь создать учетную запись пользователя mysql во время выполнения в PHP7.0, предоставил доступ к одной базе данных, также созданной во время выполнения.В настоящее время я использую:

$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->; 1004 *

Соединение не удалось: доступ запрещен для пользователя 'dbUsername' @ 'localhost' (используется пароль: ДА)

Если я это сделаю;

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

Тогда соединениеработает и все хорошо.Пожалуйста, помогите.

* edit: я удалил поведение транзакций, удаление его из живого кода не решило проблему.Похоже, что строка пароля изменяется где-то между PHP и MySQL?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Кроме того, большинство баз данных имеют ограничения.Но для целей отладки и обучения вы можете включить общий журнал в mysql (который будет регистрировать ВСЕ запросы).

Это создаст большие накладные расходы и не будет соответствовать производственным требованиям, но это быстрый и простой способ исправления ошибок в среде разработки.

Используя имя примера @foxfabi DB, получил следующий вывод изВаши запросы:

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
0 голосов
/ 25 января 2019

В основном, команды управления транзакциями используются с такими командами DML, как - INSERT, UPDATE и DELETE. Если вы используете их при создании или удалении таблиц, результат может зависеть от режима автоматической фиксации. По умолчанию автоматически фиксирует изменения постоянно в базе данных .

Если вы прочитаете статью " Как популярные базы данных работают с командами DDL в транзакциях ", вы заметите, что не все базы данных способны откатывать изменения DDL. Они поддерживают транзакционность команд DDL, но не для всех команд.

Также вы найдете в MySQL Internals Manual , что операторы DDL и операции с нетранзакционными механизмами не «регистрируются» в списках транзакций. Проверьте, какой движок вы используете (InnoDB или MyISAM).

Я воспроизвел пример исключительно в и обнаружил, что причиной является FLUSH. Это подтверждается в руководстве. Оператор FLUSH вызывает неявную фиксацию .

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 «клиент» и «админ» созданы с правами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...