Неможливо видалити анонімного користувача з mysql.user


15

Я намагаюся скинути анонімних користувачів з моєї бази даних mysql.users. Однак я отримую дивну поведінку. Коли я ввожу команду:

DROP User ''@'WOPR';

Я отримував загальне повідомлення про помилку. Отже, я перезавантажив свою машину і спробував її ще раз. Цього разу я отримав відповідь

Query OK, 0 rows affected.

Але коли я вкладаю

SELECT User, Host, Password FROM mysql.user WHERE User='';

Повернення:

+------+------+----------+
| User | Host | Password |
+------+------+----------+
|      | WOPR |          |
+------+------+----------+

(WOPR - моє ім'я хоста)

Я запускаю команду

DROP User ''@'WOPR';

і отримати той же результат.

Я запускаю нову інсталяцію MySQL 5.5 на Arch Linux, версія ядра 2.6.33.

Хтось знає, що може викликати таку поведінку?


Будь ласка, отримайте слово, щоб надіслати запитання такого характеру до DBA StackExchange !!!
RolandoMySQLDBA

Відповіді:


15
DELETE FROM mysql.user WHERE user='' AND host='WOPR';
FLUSH PRIVILEGES;

Це має зробити це за вас.

Спробувати !!!

КАВАТИ

У MySQL є певні користувачі, попередньо встановлені в mysql.user. Також mysql.db постачається з двома користувачами, які мають анонімний доступ та повні привілеї для тестування баз даних.

Просто роби це

SELECT * FROM mysql.db \G

і ви побачите, що кожен, хто підключається до тесту або будь-якої бази даних, починаючи з test_, може в значній мірі зробити все в тестовій базі даних. Це погано, оскільки людина, що має повний доступ до будь-якої тестової бази даних, може з'їсти диск за лічені хвилини.

Приклад:

use test
CREATE TABLE junk (INT a) ENGINE=MyISAM;
INSERT INTO junk VALUES (1);

Гаразд, велика справа. Він складає таблицю з 4 байтами.

Зараз спробую запустити цей оператор SQL 30 разів:

INSERT INTO junk SELECT * FROM junk;

Привіт, миттєва таблиця з 1,073,741,824 рядків (4 ГБ + файл) !!! Виявляючи повні права на тестову базу даних, де ви можете нанести дискот подібного роду.

Моя рада вам запустити це, щоб очистити доступ тестового користувача:

DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

Для подальшого роз'яснення див. Мій пост MySQL: Чому в mysql.db є "тестові" записи?

Ура !!!


Привіт Роландо, це зробив трюк, дякую! Я фактично виправляю доступ до своєї тестової бази даних прямо зараз.
SirTasty

Чи не існує способу використовувати drop userсинтаксис замість того, щоб mysql.userбезпосередньо змінювати базову таблицю?
Печер'є

1
@Pacerier Будь ласка, подивіться на оригінальне запитання. Справжня проблема полягає в тому, що DROP USERсинтаксис не працює, коли поле користувача порожнє (порожній рядок). Ви повинні це зробити так, як вказала відповідь.
RolandoMySQLDBA

@RolandoMySQLDBA, Чи існують інші рішення, окрім того, як обробляти mysql.userстіл?
Пейс’єр

@Pacerier Якщо ви прочитаєте моє останнє посилання, ви зрозумієте, що MySQL (зараз Oracle) розміщує два ряди безпосередньо mysql.dbпісля встановлення, що дозволить анонімним користувачам отримати доступ до тестової бази даних. Цікаво, що мені сказали, що установка Percona Server видаляє ці рядки до завершення її встановлення ( dba.stackexchange.com/questions/66584/… ). Оскільки ви використовуєте MySQL, запустіть mysql_secure_installation або видаліть ці два ряди самостійно.
RolandoMySQLDBA
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.