Không thể bỏ người dùng ẩn danh khỏi mysql.user


15

Tôi đang cố gắng DROP người dùng ẩn danh từ cơ sở dữ liệu mysql.users của tôi. Tuy nhiên, tôi đã nhận được hành vi kỳ lạ. Khi tôi nhập lệnh:

DROP User ''@'WOPR';

Tôi đã nhận được một thông báo lỗi chung. Vì vậy, tôi đã khởi động lại máy của mình và thử lại. Lần này tôi nhận được phản hồi

Query OK, 0 rows affected.

Nhưng khi tôi đặt vào

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

Sự trở lại là:

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

(WOPR là tên máy chủ của tôi)

Tôi chạy lệnh

DROP User ''@'WOPR';

và nhận được kết quả tương tự.

Tôi đang chạy bản cài đặt mới của MySQL 5.5 trên Arch Linux, phiên bản kernel 2.6.33.

Có ai biết những gì có thể gây ra hành vi này?


Vui lòng nhận thông báo để gửi câu hỏi có tính chất này đến DBA StackExchange !!!
RolandoMySQLDBA

Câu trả lời:


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

Điều này sẽ làm điều đó cho bạn.

Hãy thử một lần !!!

CẨN THẬN

MySQL có một số người dùng được cài đặt sẵn vào mysql.user. Ngoài ra, mysql.db đi kèm với hai người dùng có quyền truy cập ẩn danh và các đặc quyền đầy đủ để kiểm tra cơ sở dữ liệu.

Chỉ cần làm điều này

SELECT * FROM mysql.db \G

và bạn sẽ thấy rằng bất kỳ ai kết nối với kiểm tra hoặc bất kỳ cơ sở dữ liệu nào bắt đầu bằng test_ đều có thể thực hiện mọi thứ trong cơ sở dữ liệu kiểm tra. Điều này là xấu vì một người có quyền truy cập đầy đủ vào bất kỳ cơ sở dữ liệu kiểm tra nào có thể ăn hết đĩa chỉ trong vài phút.

Thí dụ:

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

OK, vấn đề lớn. Nó tạo một bảng có 4 byte.

Bây giờ đang thử chạy câu lệnh SQL này 30 lần:

INSERT INTO junk SELECT * FROM junk;

Xin chào một bảng ngay lập tức với 1.073.741.824 hàng (tệp 4GB +) !!! Hình ảnh có toàn quyền đối với cơ sở dữ liệu thử nghiệm nơi bạn có thể phá hủy loại hình tàn phá này trên đĩa.

Lời khuyên của tôi cho bạn là hãy chạy nó để xóa quyền truy cập của người dùng:

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

Để làm rõ hơn, hãy xem bài viết của tôi về MySQL: Tại sao lại có các mục "kiểm tra" trong mysql.db?

Chúc mừng !!!


Xin chào Rolando, đã làm điều đó, cảm ơn! Tôi thực sự đang sửa chữa truy cập cơ sở dữ liệu thử nghiệm của tôi ngay bây giờ.
SirTasty

Có cách nào để sử dụng drop usercú pháp thay vì sửa đổi mysql.usertrực tiếp bảng bên dưới không?
Pacerier

1
@Pacerier Hãy nhìn vào câu hỏi ban đầu. Vấn đề thực sự là DROP USERcú pháp không hoạt động khi trường người dùng trống (chuỗi trống). Bạn phải làm theo cách trả lời chỉ định.
RolandoMySQLDBA

@RolandoMySQLDBA, Có giải pháp nào khác ngoài việc hack xung quanh mysql.userbảng không?
Pacerier

@Pacerier Nếu bạn đọc liên kết cuối cùng của tôi, bạn sẽ nhận ra rằng MySQL (bây giờ là Oracle) đặt hai hàng trực tiếp vào mysql.dbkhi cài đặt sẽ cho phép người dùng ẩn danh truy cập cơ sở dữ liệu thử nghiệm. Thật thú vị, tôi được cho biết rằng cài đặt của Percona Server sẽ xóa các hàng đó trước khi quá trình cài đặt hoàn tất ( dba.stackexchange.com/questions/66584/, ). Vì bạn đang sử dụng MySQL, nên chạy mysql_secure_installation hoặc tự xóa hai hàng đó.
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.