ไม่สามารถปล่อยผู้ใช้นิรนามจาก mysql.user


15

ฉันพยายามที่จะ DROP ผู้ใช้ที่ไม่ระบุชื่อจากฐานข้อมูล 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 แถว (ไฟล์ 4GB +) !!! การถ่ายภาพมีสิทธิ์เต็มรูปแบบไปยังฐานข้อมูลทดสอบที่คุณสามารถทำลายความเสียหายประเภทนี้บนดิสก์

คำแนะนำของฉันคือการใช้สิ่งนี้เพื่อล้างการทดสอบการเข้าถึงของผู้ใช้:

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

สำหรับการชี้แจงเพิ่มเติมดูโพสต์ของฉันMySQL: ทำไมมีรายการ "ทดสอบ" ใน mysql.db

ไชโย !!!


สวัสดี Rolando นั่นเป็นกลอุบายขอบคุณ! ตอนนี้ฉันกำลังแก้ไขการเข้าถึงฐานข้อมูลทดสอบของฉัน
SirTasty

ไม่มีวิธีใช้drop userไวยากรณ์แทนการแก้ไขmysql.userตารางต้นแบบโดยตรงหรือไม่
Pacerier

1
@Pacerier โปรดดูคำถามเดิม ปัญหาที่แท้จริงคือDROP USERไวยากรณ์ไม่ทำงานเมื่อฟิลด์ผู้ใช้ว่างเปล่า (สตริงว่าง) คุณต้องทำตามที่ระบุไว้ในคำตอบ
RolandoMySQLDBA

@RolandoMySQLDBA มีวิธีแก้ไขปัญหาอื่นนอกเหนือจากการแฮ็คกับmysql.userตารางหรือไม่
Pacerier

@Pacerier หากคุณอ่านลิงค์สุดท้ายของฉันคุณจะรู้ว่า MySQL (ตอนนี้ Oracle) วางสองแถวลงในmysql.dbการติดตั้งโดยตรงซึ่งจะช่วยให้ผู้ใช้ที่ไม่ระบุชื่อสามารถเข้าถึงฐานข้อมูลทดสอบได้ ที่น่าสนใจคือมีคนบอกฉันว่าการติดตั้งเซิร์ฟเวอร์ Percona ลบแถวเหล่านั้นก่อนที่การติดตั้งจะเสร็จสมบูรณ์ ( dba.stackexchange.com/questions/66584/… ) เมื่อคุณใช้งาน MySQL ให้รัน mysql_secure_installation หรือลบทั้งสองแถวด้วยตัวเอง
RolandoMySQLDBA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.