پرش به مطلب اصلی

مسدودکننده اسپم

Spam Blocker یک سرویس متمرکز تشخیص اسپم است که انتشارهای ورودی را ارزیابی می‌کند و به هرکدام امتیاز ریسک می‌دهد. از دو بسته تشکیل شده است:

  • @bitsocial/spam-blocker-server — سرور HTTP که APIهای ارزیابی و چالش را میزبانی می‌کند.
  • @bitsocial/spam-blocker-challenge — یک بسته سبک سمت کلاینت که انجمن‌ها آن را یکپارچه می‌کنند تا انتشارها را برای ارزیابی بفرستند.

کد منبع: github.com/bitsocialnet/spam-blocker

امتیازدهی ریسک چگونه کار می‌کند

هر انتشاری که به نقطه پایانی /evaluate فرستاده شود یک امتیاز ریسک عددی می‌گیرد. این امتیاز ترکیب وزن‌دار چند سیگنال است:

سیگنالتوضیح
قدمت حسابحساب‌های تازه‌تر امتیاز ریسک بالاتری می‌گیرند.
کارماکارمای انباشته در انجمن‌ها ریسک را کم می‌کند.
اعتبار نویسندهداده‌های اعتباری که نمایه‌ساز پس‌زمینه شبکه گرد می‌آورد.
تحلیل محتوااکتشافی‌های سطح متن (چگالی پیوند، الگوهای شناخته‌شده اسپم و مانند آن).
سرعت انتشارمطالب پیاپی و پرشتاب از یک نویسنده ریسک را بالا می‌برد.
هوشمندی IPمکان‌یابی جغرافیایی در سطح کشور و استعلام از فیدهای تهدید. فقط کد کشور نگهداری می‌شود — نشانی‌های خام IP هرگز با انجمن‌ها به اشتراک گذاشته نمی‌شود.

آستانه‌های رده‌ها

امتیاز ریسک به یکی از چهار رده قابل تنظیم نگاشت می‌شود و همان رده تعیین می‌کند در ادامه چه اتفاقی بیفتد:

  1. پذیرش خودکار — امتیاز آن‌قدر پایین است که انتشار بدون هیچ چالشی تأیید می‌شود.
  2. کفایت OAuth — نویسنده باید یک تأیید هویت OAuth را کامل کند تا ادامه دهد.
  3. OAuth به‌علاوه موارد بیشتر — تنها OAuth کافی نیست؛ تأیید افزوده (مثلاً CAPTCHA) لازم است.
  4. رد خودکار — امتیاز بیش از اندازه بالاست؛ انتشار یکسره رد می‌شود.

همه مقادیر آستانه برای هر انجمن جداگانه قابل تنظیم است.

جریان چالش

وقتی یک انتشار در رده‌ای می‌افتد که تأیید لازم دارد، جریان چالش آغاز می‌شود:

  1. نخست از نویسنده خواسته می‌شود از راه OAuth (GitHub، Google، Twitter و دیگر ارائه‌دهندگان پشتیبانی‌شده) احراز هویت کند.
  2. اگر تنها OAuth کافی نباشد (رده ۳)، یک CAPTCHA جایگزین بر پایه Cloudflare Turnstile نمایش داده می‌شود.
  3. هویت OAuth تنها برای تأیید به کار می‌رود و هرگز با انجمن یا کاربران دیگر در میان گذاشته نمی‌شود.

نقاط پایانی API

POST /evaluate

یک انتشار را برای ارزیابی ریسک ثبت می‌کند. امتیاز ریسک محاسبه‌شده و رده چالشی که لازم است را برمی‌گرداند.

POST /challenge/verify

نتیجه یک چالش کامل‌شده (توکن OAuth، پاسخ CAPTCHA یا هر دو) را برای تأیید ثبت می‌کند.

GET /iframe/:sessionId

یک صفحه HTML قابل جاسازی برمی‌گرداند که رابط چالش مناسب آن نشست را رندر می‌کند.

محدودسازی نرخ

محدودیت‌های نرخ به‌صورت پویا و بر پایه قدمت و اعتبار نویسنده اعمال می‌شوند. نویسندگان تازه‌تر یا کم‌اعتبارتر با محدودیت‌های سخت‌گیرانه‌تری روبه‌رو می‌شوند و نویسندگان جاافتاده آستانه‌های دست‌ودل‌بازتری دارند. این کار جلوی سیل اسپم را می‌گیرد بدون آنکه شرکت‌کنندگان مورد اعتماد جریمه شوند.

نمایه‌ساز پس‌زمینه شبکه

سرور یک نمایه‌ساز پس‌زمینه اجرا می‌کند که پیوسته شبکه را می‌پیماید تا داده‌های اعتبار نویسندگان را بسازد و به‌روز نگه دارد. این داده‌ها مستقیماً وارد خط لوله امتیازدهی ریسک می‌شوند و به سامانه امکان می‌دهند شرکت‌کنندگان خوش‌نیت و همیشگی را در سراسر انجمن‌ها بازبشناسد.

حریم خصوصی

Spam Blocker با نگاه به حریم خصوصی طراحی شده است:

  • هویت‌های OAuth تنها برای تأیید چالش به کار می‌روند و هرگز به انجمن‌ها اعلام نمی‌شوند.
  • نشانی‌های IP فقط به کد کشور تبدیل می‌شوند؛ IPهای خام نه ذخیره می‌شوند و نه در اختیار کسی قرار می‌گیرند.

پایگاه داده

سرور برای ماندگاری محلی داده‌های اعتبار، وضعیت نشست‌ها و پیکربندی از SQLite (از راه better-sqlite3) استفاده می‌کند.