คุณสามารถทำสิ่งที่คุณต้องการโดยจัดการฐานข้อมูลโดยตรง มีรายละเอียดอาจแตกต่างกันเล็กน้อยขึ้นอยู่กับสถานการณ์ของคุณ แต่ขั้นตอนพื้นฐานจะเป็นดังนี้:
ตั้งวิกิพีเดียของคุณไปยังโหมดอ่านอย่างเดียว คุณไม่ต้องการให้ใครลองแก้ไขวิกิในขณะที่คุณกำลังยุ่งกับฐานข้อมูล
สำรองข้อมูลวิกิของคุณ (แนะนำอย่างยิ่งก่อนการลบมวลที่ไม่สามารถย้อนกลับได้)
ลบบัญชีผู้ใช้ทั้งหมดที่สร้างโดยผู้ส่งอีเมลขยะ หากในคำถามข้างต้นคุณเป็นผู้ใช้ที่ถูกต้องคุณสามารถทำได้:
DELETE FROM user WHERE user_id != YOUR_USER_ID;
อีกทางหนึ่งหากไม่มีบัญชีที่ถูกต้องใหม่ถูกสร้างขึ้นหลังจากผู้ส่งอีเมลขยะค้นพบวิกิคุณสามารถค้นหาหมายเลข ID ผู้ใช้ที่ถูกต้องสูงสุดและทำ:
DELETE FROM user WHERE user_id > LAST_VALID_USER_ID;
หรือคุณสามารถใช้เครื่องมือผู้ดูแลระบบเช่น phpMyAdmin เพื่อเลือกบัญชีที่ถูกต้องและลบที่เหลือ
ล้างข้อมูลเพิ่มเติมที่เกี่ยวข้องกับบัญชีที่ถูกลบ นี่ไม่ใช่สิ่งที่จำเป็นอย่างเคร่งครัด แต่ระเบียนที่ถูกโยงถึงเหล่านั้นไม่มีประโยชน์และจะทำให้ฐานข้อมูลของคุณยุ่งเหยิงหากคุณไม่ได้ลบทิ้ง:
DELETE FROM user_groups WHERE ug_user NOT IN (SELECT user_id FROM user);
DELETE FROM user_properties WHERE up_user NOT IN (SELECT user_id FROM user);
DELETE FROM user_newtalk WHERE user_id NOT IN (SELECT user_id FROM user);
ลบการแก้ไขใด ๆ ที่ไม่ได้ทำโดยผู้ใช้ที่ถูกต้อง:
นี่คือขั้นตอนใหญ่ ทุกอย่างก่อนที่มันจะถูกเตรียมทุกอย่างหลังจากมันคือการทำความสะอาด ด้วยการลบบัญชีสแปมทั้งหมดคุณสามารถทำได้:
DELETE FROM revision WHERE rev_user > 0 AND rev_user NOT IN (SELECT user_id FROM user);
หากวิกิของคุณปิดใช้งานการแก้ไขแบบไม่ระบุชื่อ (ซึ่งฉันขอแนะนำอย่างยิ่งสำหรับส่วนตัว / ทดสอบวิกิ) แบบสอบถามข้างต้นควรเพียงพอที่จะกำจัดการแก้ไขสแปมทั้งหมด อย่างไรก็ตามหากคุณเปิดใช้งานการแก้ไขแบบไม่ต่อเนื่องคุณจะต้องดักฟังสแปมที่ไม่ระบุตัวตนแยกจากกัน
ถ้าคุณแน่ใจว่าทุกแก้ไขอานนท์ในวิกิพีเดียของคุณเป็นสแปม, การแก้ไขเพียงทำโดยโพสต์ 0 ที่เราอาจจะต้องรักษาความเป็นผู้ที่ทำหน้าที่โยงตัวเอง (เช่นหน้านำเข้าจากนอกวิกิพีเดีย) ในกรณีดังกล่าวบางสิ่งเช่นแบบสอบถามต่อไปนี้ควรใช้งานได้:
DELETE FROM revision WHERE rev_user = 0 AND rev_user_text BETWEEN '1' AND '999';
การดำเนินการนี้จะลบการแก้ไขใด ๆ ด้วย UID 0 ที่ชื่อผู้ใช้มีลักษณะคล้ายกับที่อยู่ IPv4 นั่นคือมันเริ่มต้นด้วยตัวเลขระหว่าง 1 ถึง 9
หากวิกิของคุณมีการแก้ไขที่ไม่ถูกต้องตามกฎหมายคุณอาจต้องสร้างสรรค์มากขึ้น หากจำนวนที่อยู่ IP ที่ใช้โดยผู้แก้ไขที่ไม่ได้ลงทะเบียนถูกต้องตามกฎหมายมี จำกัด คุณสามารถเพิ่มข้อเช่นAND rev_user_text NOT IN ('1.2.3.4', '5.6.7.8', '9.10.11.12')
ในแบบสอบถามด้านบนเพื่อแยกการมีส่วนร่วมของ IP เหล่านั้นออกจากการลบ นอกจากนี้คุณยังสามารถเพิ่มเงื่อนไขเช่นพูดAND rev_user_text NOT LIKE '192.168.%'
เพื่อบันทึกการแก้ไขทั้งหมดจากที่อยู่ IP ที่ขึ้นต้นด้วยคำนำหน้าเฉพาะ
ข้อความค้นหาข้างต้นจะกำจัดการแก้ไขสแปม (แม้ว่าเนื้อหาจะยังคงอยู่ในtext
ตาราง) แต่จะออกจากpage_latest
ฟิลด์ของหน้าเว็บที่ได้รับผลกระทบใด ๆ ที่ชี้ไปยังการแก้ไขที่ไม่มีอยู่ นี่อาจทำให้เกิดความสับสนดังนั้นเราควรแก้ไขให้ดีกว่า
ก่อนอื่นเราต้องลบpage_latest
คอลัมน์สำหรับทุกหน้า:
UPDATE page SET page_latest = 0;
ต่อไปเราจะสร้างคอลัมน์ใหม่โดยเรียกใช้สคริปต์การบำรุงรักษาattachLatest.php (แนะนำให้อย่าลืมใช้--fix
พารามิเตอร์เพื่อให้สคริปต์เปลี่ยนฐานข้อมูลจริง ๆ ) หรือด้วยการสืบค้น SQL แบบแมนนวล:
UPDATE page SET page_latest =
(SELECT MAX(rev_id) FROM revision WHERE rev_page = page_id);
สุดท้ายเราจะลบหน้าทั้งหมดที่ไม่พบการแก้ไขที่ถูกต้อง (เพราะถูกสร้างโดยผู้ส่งอีเมลขยะและไม่เคยมีเนื้อหาที่ถูกต้อง):
DELETE FROM page WHERE page_latest = 0;
สำหรับการสัมผัสครั้งสุดท้ายให้สร้างลิงค์ดัชนีข้อความและตารางการเปลี่ยนแปลงล่าสุดโดยรันสคริปต์การบำรุงรักษาrebuildall.php คุณอาจต้องการลบเนื้อหาของการแก้ไขสแปมที่ถูกลบออกจากฐานข้อมูลเพื่อไม่ให้มีพื้นที่ไม่จำเป็นโดยการรันสคริปต์บำรุงรักษาpurgeOldText.php
เมื่อทำเสร็จแล้วให้ตรวจสอบว่าทุกอย่างดูดีและหากเป็นเช่นนั้นให้ปิดโหมดอ่านอย่างเดียวหวังว่าหลังจากติดตั้งฟีเจอร์ป้องกันสแปมแล้วเพื่อป้องกันไม่ให้เกิดปัญหาซ้ำอีก