ข้ามไปที่เนื้อหาหลัก

Spam Blocker

Spam Blocker คือบริการตรวจจับสแปมแบบรวมศูนย์ที่ตรวจสอบเนื้อหาซึ่งถูกส่งเข้ามาเผยแพร่ แล้วให้คะแนนความเสี่ยงกับเนื้อหาแต่ละชิ้น ประกอบด้วยแพ็กเกจสองตัว:

  • @bitsocial/spam-blocker-server -- เซิร์ฟเวอร์ HTTP ที่ให้บริการ API สำหรับการประเมินและความท้าทาย
  • @bitsocial/spam-blocker-challenge -- แพ็กเกจไคลเอ็นต์ขนาดเบาที่ชุมชนนำไปผสานรวม เพื่อส่งเนื้อหาไปให้ประเมิน

ซอร์สโค้ด: github.com/bitsocialnet/spam-blocker

การให้คะแนนความเสี่ยงทำงานอย่างไร

เนื้อหาทุกชิ้นที่ถูกส่งไปยังปลายทาง /evaluate จะได้รับคะแนนความเสี่ยงเป็นตัวเลข คะแนนนี้เกิดจากการถ่วงน้ำหนักสัญญาณหลายอย่างเข้าด้วยกัน:

สัญญาณรายละเอียด
อายุของบัญชีบัญชีที่เพิ่งสร้างใหม่จะได้คะแนนความเสี่ยงสูงกว่า
คะแนน KarmaKarma ที่สะสมไว้ในชุมชนช่วยลดความเสี่ยงลง
ชื่อเสียงของผู้เขียนข้อมูลชื่อเสียงที่รวบรวมโดยตัวจัดทำดัชนีเครือข่ายซึ่งทำงานอยู่เบื้องหลัง
การวิเคราะห์เนื้อหาฮิวริสติกระดับข้อความ (ความหนาแน่นของลิงก์ รูปแบบสแปมที่รู้จักกันดี ฯลฯ)
ความถี่ในการโพสต์การโพสต์ติด ๆ กันอย่างรวดเร็วจากผู้เขียนคนเดียวกันทำให้ความเสี่ยงสูงขึ้น
ข้อมูลข่าวกรองเรื่อง IPการระบุตำแหน่งระดับประเทศและการตรวจสอบกับฟีดภัยคุกคาม ระบบเก็บเพียงรหัสประเทศ -- ที่อยู่ IP ดิบไม่เคยถูกแชร์ให้ชุมชน

เกณฑ์ของแต่ละระดับ

คะแนนความเสี่ยงจะถูกจับคู่เข้ากับหนึ่งในสี่ระดับที่ปรับตั้งค่าได้ ซึ่งเป็นตัวกำหนดว่าจะเกิดอะไรขึ้นต่อไป:

  1. ยอมรับอัตโนมัติ -- คะแนนต่ำพอที่จะอนุมัติให้เผยแพร่ได้โดยไม่ต้องผ่านความท้าทายใด ๆ
  2. OAuth เพียงพอ -- ผู้เขียนต้องยืนยันตัวตนผ่าน OAuth ให้สำเร็จก่อนจึงจะไปต่อได้
  3. OAuth ยังไม่พอ -- ลำพัง OAuth ไม่เพียงพอ ต้องมีการยืนยันเพิ่มเติม (เช่น CAPTCHA)
  4. ปฏิเสธอัตโนมัติ -- คะแนนสูงเกินไป เนื้อหาจะถูกปฏิเสธไปตรง ๆ

ค่าเกณฑ์ทั้งหมดตั้งค่าแยกกันได้ในแต่ละชุมชน

ขั้นตอนของความท้าทาย

เมื่อเนื้อหาชิ้นหนึ่งตกอยู่ในระดับที่ต้องมีการยืนยันตัวตน ขั้นตอนความท้าทายจะเริ่มทำงาน:

  1. ผู้เขียนจะถูกขอให้ยืนยันตัวตนผ่าน OAuth ก่อน (GitHub, Google, Twitter และผู้ให้บริการอื่นที่รองรับ)
  2. หากลำพัง OAuth ยังไม่เพียงพอ (ระดับ 3) ระบบจะแสดง CAPTCHA สำรอง ซึ่งขับเคลื่อนด้วย Cloudflare Turnstile
  3. ตัวตนจาก OAuth ถูกใช้เพื่อการยืนยันเท่านั้น และ ไม่เคยถูกแชร์ ให้ชุมชนหรือผู้ใช้รายอื่น

ปลายทาง API

POST /evaluate

ส่งเนื้อหาเข้าไปประเมินความเสี่ยง แล้วรับคะแนนความเสี่ยงที่คำนวณได้พร้อมระดับความท้าทายที่ต้องผ่านกลับมา

POST /challenge/verify

ส่งผลลัพธ์ของความท้าทายที่ทำเสร็จแล้ว (โทเค็น OAuth คำตอบ CAPTCHA หรือทั้งสองอย่าง) เข้ามาเพื่อตรวจสอบ

GET /iframe/:sessionId

ส่งคืนหน้า HTML ที่ฝังลงในเว็บได้ ซึ่งจะเรนเดอร์ UI ของความท้าทายที่เหมาะกับเซสชันนั้น

การจำกัดอัตราการเรียกใช้

ขีดจำกัดอัตราถูกปรับแบบไดนามิกตามอายุและชื่อเสียงของผู้เขียน ผู้เขียนที่เพิ่งเข้ามาใหม่หรือมีชื่อเสียงน้อยจะเจอข้อจำกัดที่เข้มงวดกว่า ส่วนผู้เขียนที่อยู่มานานจะได้เพดานที่ผ่อนปรนกว่า วิธีนี้ช่วยสกัดการถล่มด้วยสแปมโดยไม่ลงโทษผู้เข้าร่วมที่ไว้ใจได้

ตัวจัดทำดัชนีเครือข่ายเบื้องหลัง

เซิร์ฟเวอร์รันตัวจัดทำดัชนีเบื้องหลังที่ไล่เก็บข้อมูลจากเครือข่ายอย่างต่อเนื่อง เพื่อสร้างและดูแลข้อมูลชื่อเสียงของผู้เขียน ข้อมูลชุดนี้ถูกป้อนเข้าไปป์ไลน์การให้คะแนนความเสี่ยงโดยตรง ทำให้ระบบจดจำผู้เข้าร่วมที่มีเจตนาดีซึ่งกลับมาใช้งานซ้ำได้ข้ามชุมชน

ความเป็นส่วนตัว

Spam Blocker ออกแบบโดยคำนึงถึงความเป็นส่วนตัวเป็นหลัก:

  • ตัวตนจาก OAuth ถูกใช้เพื่อยืนยันความท้าทายเท่านั้น และ ไม่เคยถูกเปิดเผย ต่อชุมชน
  • ที่อยู่ IP ถูกแปลงให้เหลือเพียง รหัสประเทศ เท่านั้น ส่วน IP ดิบไม่ถูกจัดเก็บและไม่ถูกแชร์

ฐานข้อมูล

เซิร์ฟเวอร์ใช้ SQLite (ผ่าน better-sqlite3) ในการเก็บข้อมูลชื่อเสียง สถานะเซสชัน และการตั้งค่าไว้ในเครื่องอย่างถาวร