Spam Blocker
Spam Blocker คือบริการตรวจจับสแปมแบบรวมศูนย์ที่ตรวจสอบเนื้อหาซึ่งถูกส่งเข้ามาเผยแพร่ แล้วให้คะแนนความเสี่ยงกับเนื้อหาแต่ละชิ้น ประกอบด้วยแพ็กเกจสองตัว:
@bitsocial/spam-blocker-server-- เซิร์ฟเวอร์ HTTP ที่ให้บริการ API สำหรับการประเมินและความท้าทาย@bitsocial/spam-blocker-challenge-- แพ็กเกจไคลเอ็นต์ขนาดเบาที่ชุมชนนำไปผสานรวม เพื่อส่งเนื้อหาไปให้ประเมิน
ซอร์สโค้ด: github.com/bitsocialnet/spam-blocker
การให้คะแนนความเสี่ยงทำงานอย่างไร
เนื้อหาทุกชิ้นที่ถูกส่งไปยังปลายทาง /evaluate จะได้รับคะแนนความเสี่ยงเป็นตัวเลข คะแนนนี้เกิดจากการถ่วงน้ำหนักสัญญาณหลายอย่างเข้าด้วยกัน:
| สัญญาณ | รายละเอียด |
|---|---|
| อายุของบัญชี | บัญชีที่เพิ่งสร้างใหม่จะได้คะแนนความเสี่ยงสูงกว่า |
| คะแนน Karma | Karma ที่สะสมไว้ในชุมชนช่วยลดความเสี่ยงลง |
| ชื่อเสียงของผู้เขียน | ข้อมูลชื่อเสียงที่รวบรวมโดยตัวจัดทำดัชนีเครือข่ายซึ่งทำงานอยู่เบื้องหลัง |
| การวิเคราะห์เนื้อหา | ฮิวริสติกระดับข้อความ (ความหนาแน่นของลิงก์ รูปแบบสแปมที่รู้จักกันดี ฯลฯ) |
| ความถี่ในการโพสต์ | การโพสต์ติด ๆ กันอย่างรวดเร็วจากผู้เขียนคนเดียวกันทำให้ความเสี่ยงสูงขึ้น |
| ข้อมูลข่าวกรองเรื่อง IP | การระบุตำแหน่งระดับประเทศและการตรวจสอบกับฟีดภัยคุกคาม ระบบเก็บเพียงรหัสประเทศ -- ที่อยู่ IP ดิบไม่เคยถูกแชร์ให้ชุมชน |
เกณฑ์ของแต่ละระดับ
คะแนนความเสี่ยงจะถูกจับคู่เข้ากับหนึ่งในสี่ระดับที่ปรับตั้งค่าได้ ซึ่งเป็นตัวกำหนดว่าจะเกิดอะไรขึ้นต่อไป:
- ยอมรับอัตโนมัติ -- คะแนนต่ำพอที่จะอนุมัติให้เผยแพร่ได้โดยไม่ต้องผ่านความท้าทายใด ๆ
- OAuth เพียงพอ -- ผู้เขียนต้องยืนยันตัวตนผ่าน OAuth ให้สำเร็จก่อนจึงจะไปต่อได้
- OAuth ยังไม่พอ -- ลำพัง OAuth ไม่เพียงพอ ต้องมีการยืนยันเพิ่มเติม (เช่น CAPTCHA)
- ปฏิเสธอัตโนมัติ -- คะแนนสูงเกินไป เนื้อหาจะถูกปฏิเสธไปตรง ๆ
ค่าเกณฑ์ทั้งหมดตั้งค่าแยกกันได้ในแต่ละชุมชน
ขั้นตอนของความท้าทาย
เมื่อเนื้อหาชิ้นหนึ่งตกอยู่ในระดับที่ต้องมีการยืนยันตัวตน ขั้นตอนความท้าทายจะเริ่มทำงาน:
- ผู้เขียนจะถูกขอให้ยืนยันตัวตนผ่าน OAuth ก่อน (GitHub, Google, Twitter และผู้ให้บริการอื่นที่รองรับ)
- หากลำพัง OAuth ยังไม่เพียงพอ (ระดับ 3) ระบบจะแสดง CAPTCHA สำรอง ซึ่งขับเคลื่อนด้วย Cloudflare Turnstile
- ตัวตนจาก OAuth ถูกใช้เพื่อการยืนยันเท่านั้น และ ไม่เคยถูกแชร์ ให้ชุมชนหรือผู้ใช้รายอื่น
ปลายทาง API
POST /evaluate
ส่งเนื้อหาเข้าไปประเมินความเสี่ยง แล้วรับคะแนนความเสี่ยงที่คำนวณได้พร้อมระดับความท้าทายที่ต้องผ่านกลับมา
POST /challenge/verify
ส่งผลลัพธ์ของความท้าทายที่ทำเสร็จแล้ว (โทเค็น OAuth คำตอบ CAPTCHA หรือทั้งสองอย่าง) เข้ามาเพื่อตรวจสอบ
GET /iframe/:sessionId
ส่งคืนหน้า HTML ที่ฝังลงในเว็บได้ ซึ่งจะเรนเดอร์ UI ของความท้าทายที่เหมาะกับเซสชันนั้น
การจำกัดอัตราการเรียกใช้
ขีดจำกัดอัตราถูกปรับแบบไดนามิกตามอายุและชื่อเสียงของผู้เขียน ผู้เขียนที่เพิ่งเข้ามาใหม่หรือมีชื่อเสียงน้อยจะเจอข้อจำกัดที่เข้มงวดกว่า ส่วนผู้เขียนที่อยู่มานานจะได้เพดานที่ผ่อนปรนกว่า วิธีนี้ช่วยสกัดการถล่มด้วยสแปมโดยไม่ลงโทษผู้เข้าร่วมที่ไว้ใจได้
ตัวจัดทำดัชนีเครือข่ายเบื้องหลัง
เซิร์ฟเวอร์รันตัวจัดทำดัชนีเบื้องหลังที่ไล่เก็บข้อมูลจากเครือข่ายอย่างต่อเนื่อง เพื่อสร้างและดูแลข้อมูลชื่อเสียงของผู้เขียน ข้อมูลชุดนี้ถูกป้อนเข้าไปป์ไลน์การให้คะแนนความเสี่ยงโดยตรง ทำให้ระบบจดจำผู้เข้าร่วมที่มีเจตนาดีซึ่งกลับมาใช้งานซ้ำได้ข้ามชุมชน
ความเป็นส่วนตัว
Spam Blocker ออกแบบโดยคำนึงถึงความเป็นส่วนตัวเป็นหลัก:
- ตัวตนจาก OAuth ถูกใช้เพื่อยืนยันความท้าทายเท่านั้น และ ไม่เคยถูกเปิดเผย ต่อชุมชน
- ที่อยู่ IP ถูกแปลงให้เหลือเพียง รหัสประเทศ เท่านั้น ส่วน IP ดิบไม่ถูกจัดเก็บและไม่ถูกแชร์
ฐานข้อมูล
เซิร์ฟเวอร์ใช้ SQLite (ผ่าน better-sqlite3) ในการเก็บข้อมูลชื่อเสียง สถานะเซสชัน และการตั้งค่าไว้ในเครื่องอย่างถาวร