MySQL 8 против MySQL 5: Почему подстановочные знаки неправильно работают в команде GRANTs? - PullRequest
1 голос
/ 28 мая 2020

Я столкнулся с одним из моих старых проектов (с использованием MySQL 5 и PHP 5.5). Я просто хотел протестировать этот проект, используя MySQL 8 и PHP7 .0. Чтобы установить БД, я обычно делаю:

...
mysql -u root -p < DBinstall/webAppDBinstall.sql
...

в сценарии установки для моего веб-приложения. Команды sql содержат:

...
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
...

Затем я получаю следующую ошибку от PHP при запуске веб-приложения:

$ cat /var/log/apache2/error.log

...
[Thu May 28 06:01:26.317867 2020] [:error] [pid 8906] [client 127.0.0.1:32960] PHP Warning:  mysqli::query(): Couldn't fetch mysqli in /var/www/webApp/src_php/mylib.php on line 68, referer: http://webApp/index.php?error=0 
...

Примечание: что этот проект работал безупречно с использованием MySQL 5 и PHP 5.

Тогда я подумал, что «это пахнет» как привилегия. Итак, я сделал следующее:

mysql> select User,Table_name,Table_priv from mysql.tables_priv where User='php_script';
+------------+------------+------------+
| User       | Table_name | Table_priv |
+------------+------------+------------+
| php_script | History    | Insert     |
| php_script | OrderItems | Update     |
| php_script | Orders     | Update     |
| php_script | UserStatus | Update     |
+------------+------------+------------+
4 rows in set (0.00 sec)

mysql>

Да, вот что это такое.

Вот доказательство:

Я изменил свой DBinstall/webAppDBinstall.sql скрипт FROM :

...
-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';
...

TO :

-- # ######################## SET PHP_SCRIPT & GRANTS FOR ############################
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON  webApp.Users TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.Categories TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.ProductGroups TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.CategoriesGroups TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.Products TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.Orders TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.OrderItems TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.Messages TO 'php_script'@'localhost';
GRANT INSERT,SELECT ON  webApp.History TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.Orders TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.OrderItems TO 'php_script'@'localhost';
GRANT UPDATE ON webApp.UserStatus TO 'php_script'@'localhost';
GRANT INSERT ON webApp.History TO 'php_script'@'localhost';

И РЕЗУЛЬТАТ:

mysql> select User,Table_name,Table_priv from mysql.tables_priv where User='php_script';
+------------+------------------+----------------------+
| User       | Table_name       | Table_priv           |
+------------+------------------+----------------------+
| php_script | History          | Select,Insert        |
| php_script | Categories       | Select,Insert        |
| php_script | CategoriesGroups | Select,Insert        |
| php_script | Messages         | Select,Insert        |
| php_script | OrderItems       | Select,Insert,Update |
| php_script | Orders           | Select,Insert,Update |
| php_script | ProductGroups    | Select,Insert        |
| php_script | Products         | Select,Insert        |
| php_script | UserStatus       | Select,Insert,Update |
| php_script | Users            | Select,Insert        |
+------------+------------------+----------------------+
10 rows in set (0.00 sec)

mysql>

Любые другие лучшие мысли о том, «почему это происходит с подстановочными знаками в GRANT s» ???

(ИЗВИНИТЕ за дублирование моего вопроса, НО stackoverflow ЗАПРЕЩАЕТ меня отвечать на мои вопросы)

Мой вопрос: Почему GRANT <PRIVS> ON <DB>.* TO <USER>; синтаксис подстановочных знаков перестал "работать"

Примечание: Эта проблема отличается от mysqli :: query () : Не удалось получить mysqli . Мое приложение webApp - это система, которая безупречно работает с MySQL 5.x развертываниями . ЕГО НЕ ИМЕЕТ никакого отношения к PHP (хотя, похоже, ошибка mysqli НЕ ПРИНИМАЕТСЯ).

1 Ответ

0 голосов
/ 28 мая 2020

Я только что провел тест на сервере MySQL 8, на котором я успешно выполнил следующее:

CREATE DATABASE webApp;
CREATE USER 'php_script'@'localhost' IDENTIFIED BY 'php_script';
GRANT INSERT,SELECT ON webApp.* TO 'php_script'@'localhost';

Как я и ожидал, грант с подстановочными знаками работал без проблем. Так что, я боюсь, вам нужно будет искать проблему где-нибудь еще.

Например, целевая база данных в одном из ваших примеров называется webApp, а в следующем примере - webAppDB. Так что лучше проверьте согласованность имен.

В противном случае синтаксис вашего кода выглядит нормально для MySQL 8.

[ Edit ] - дополнительные предложения

  1. Убедитесь, что для skip-name-resolve установлено значение ВЫКЛ.

Похоже, что он выключен по умолчанию на MySQL 8, но может случиться так, что при некоторых обстоятельствах он установлен на ON.

В моем случае я запускаю MySQL 8 в контейнере docker, и для этой переменной было установлено значение ON.

Если для переменной установлено значение ON, mysql не будет разрешаться localhost на фактический IP-адрес localhost, и в вашем случае это может быть проблемой.

Подробнее о skip-name-resolve здесь: https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_skip_name_resolve

Убедитесь, что вы завершили sh команды GRANT с помощью FLUSH PRIVILEGES;

Попробуйте переключить default-authentication-plugin на mysql_native_password

По умолчанию на MySQL 8 default-authentication-plugin установлено caching_sha2_password. Но похоже, что mysqli не поддерживает этот метод аутентификации (согласно этой статье от 2018: https://mysqlserverteam.com/upgrading-to-mysql-8-0-default-authentication-plugin-considerations/)

...