Tidak dapat menjatuhkan pengguna anonim dari mysql.user

15

Saya mencoba untuk DROP pengguna anonim dari database mysql.users saya. Namun, saya mendapatkan perilaku aneh. Ketika saya memasukkan perintah:

DROP User ''@'WOPR';

Saya mendapat pesan kesalahan umum. Jadi, saya reboot mesin saya, dan mencobanya lagi. Kali ini saya mendapat tanggapan

Query OK, 0 rows affected.

Tapi ketika saya dimasukkan

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

Pengembaliannya adalah:

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

(WOPR adalah nama host saya)

Saya menjalankan perintah

DROP User ''@'WOPR';

dan dapatkan hasil yang sama.

Saya menjalankan instalasi baru MySQL 5.5 di Arch Linux, kernel versi 2.6.33.

Adakah yang tahu apa yang dapat menyebabkan perilaku ini?

SirTasty
sumber
Silakan sampaikan berita untuk mengirim pertanyaan seperti ini ke DBA StackExchange !!!
RolandoMySQLDBA

Jawaban:

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

Ini harus dilakukan untuk Anda.

Cobalah !!!

CAVEAT

MySQL memiliki pengguna tertentu yang sudah diinstal ke mysql.user. Juga, mysql.db hadir dengan dua pengguna yang memiliki akses anonim dan hak istimewa penuh untuk menguji basis data.

Lakukan saja ini

SELECT * FROM mysql.db \G

dan Anda akan melihat bahwa siapa pun yang terhubung ke pengujian atau basis data apa pun yang dimulai dengan test_ dapat melakukan semuanya di dalam basis data pengujian. Ini buruk karena seseorang dengan akses penuh ke database uji apa pun dapat memakan disk dalam hitungan menit.

Contoh:

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

OK, masalah besar. Itu membuat tabel dengan 4 byte.

Sekarang coba jalankan pernyataan SQL ini 30 kali:

INSERT INTO junk SELECT * FROM junk;

Hai tabel instan dengan 1.073.741.824 baris (4GB + file) !!! Pencitraan memiliki hak penuh ke database uji di mana Anda dapat mendatangkan malapetaka semacam ini pada disk.

Saran saya kepada Anda adalah menjalankan ini untuk membersihkan akses pengguna uji:

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

Untuk klarifikasi lebih lanjut, lihat posting saya MySQL: Mengapa ada entri "test" di mysql.db?

Bersulang !!!

RolandoMySQLDBA
sumber
Hai Rolando, Itu berhasil, terima kasih! Saya sebenarnya sedang memperbaiki akses database pengujian saya sekarang.
SirTasty
Apakah tidak ada cara untuk menggunakan drop usersintaks alih-alih memodifikasi mysql.usertabel yang mendasarinya secara langsung?
Pacerier
1
@Pacerier Silakan lihat pertanyaan asli. Masalah sebenarnya adalah bahwa DROP USERsintaks tidak berfungsi ketika bidang pengguna kosong (string kosong). Anda harus melakukannya dengan cara yang ditentukan jawaban.
RolandoMySQLDBA
@RolandoMySQLDBA, Apakah ada solusi lain selain merambah mysql.usermeja?
Pacerier
@Pacerier Jika Anda membaca tautan terakhir saya, Anda akan menyadari bahwa MySQL (sekarang Oracle) menempatkan dua baris langsung mysql.dbpada saat instalasi yang akan memungkinkan pengguna anonim untuk mengakses database uji. Menariknya, saya diberitahu bahwa instalasi Percona Server menghapus baris-baris itu sebelum instalasinya selesai ( dba.stackexchange.com/questions/66584/… ). Karena Anda menggunakan MySQL, jalankan mysql_secure_installation atau hapus sendiri dua baris itu.
RolandoMySQLDBA